Java выбрать только цифры

Как проверить, содержит ли строка только цифры в Java [duplicate]

В Java для класса String существует метод, называемый match, как использовать этот метод, чтобы проверить, имеет ли моя строка только цифры с регулярным выражением. Я пробовал с примерами ниже, но оба они вернули мне ложные результаты.

String regex = "1"; String data = "23343453"; System.out.println(data.matches(regex)); 
String regex = "^9"; String data = "23343453"; System.out.println(data.matches(regex)); 

Вы должны прочитать о регулярных выражениях. У них есть два основных элемента: атомы и квантификаторы . Вы указали атом без указания квантификатора.

8 ответов

В соответствии с регулярными выражениями Java + означает «один или несколько раз» и \d означает «цифра».

Примечание: «двойная обратная косая черта» — это escape-последовательность для получения одного обратного слэша — поэтому \\d в строке java дает фактический результат: \d

Изменить: из-за некоторой путаницы в других ответах, я пишу тестовый пример и подробно расскажу подробнее.

Во-первых, если вы сомневаетесь в правильности этого решения (или других), запустите этот тестовый пример:

String regex = "\\d+"; // positive test cases, should all be "true" System.out.println("1".matches(regex)); System.out.println("12345".matches(regex)); System.out.println("123456789".matches(regex)); // negative test cases, should all be "false" System.out.println("".matches(regex)); System.out.println("foo".matches(regex)); System.out.println("aa123bb".matches(regex)); 

Вопрос 1: Не нужно ли добавлять ^ и $ в регулярное выражение, поэтому оно не будет соответствовать «aa123bb»?

Нет. В java метод matches (который был указан в вопросе) соответствует полной строке, а не фрагментам. Другими словами, нет необходимости использовать ^\\d+$ (хотя это также верно). См. Последний отрицательный тестовый пример.

Читайте также:  Access file with java

Обратите внимание, что если вы используете онлайн-средство проверки регулярных выражений, это может вести себя по-другому. Чтобы сопоставить фрагменты строки в Java, вы можете использовать метод find , описанный здесь подробно:

Вопрос 2: не будет ли это регулярное выражение соответствовать пустой строке, «» ?

Нет. Регулярное выражение \\d* будет соответствовать пустой строке, но \\d+ — нет. Звезда * означает ноль или более, тогда как плюс + означает один или несколько. Посмотрите первый отрицательный тестовый пример.

Вопрос 3: Не удается ли быстрее скомпилировать шаблон регулярного выражения?

Да.. Действительно, быстрее компилировать шаблон регулярного выражения один раз, а не при каждом вызове matches , и поэтому, если последствия производительности важны, тогда Pattern можно скомпилировать и использовать например:

Pattern pattern = Pattern.compile(regex); System.out.println(pattern.matcher("1").matches()); System.out.println(pattern.matcher("12345").matches()); System.out.println(pattern.matcher("123456789").matches()); 

Источник

Как из строки вытащить числа java

Для извлечения чисел из строки в Java можно использовать регулярные выражения. Для этого можно воспользоваться классом Pattern и Matcher :

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main  public static void main(String[] args)  String str = "abc123def456ghi789"; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); while (matcher.find())  System.out.println(matcher.group()); > > > 
  • создаем объект Pattern , используя регулярное выражение \d+ , которое означает «один или более цифр»
  • создаем объект Matcher , который будет использоваться для поиска соответствий в строке str
  • используем метод find() для поиска следующего соответствия, и метод group() для получения найденного числа. Метод find() будет продолжать искать числа, пока они есть в строке.

В результате выполнения кода будут выведены следующие числа:

Источник

Извлечь цифры из строки в Java

У меня есть объект Java String . Мне нужно извлечь из него только цифры. Я приведу пример:

«123-456-789» Я хочу «123456789»

Есть ли библиотека, которая извлекает только цифры?

Спасибо за ответы. Прежде чем попробовать, мне нужно знать, нужно ли мне устанавливать какие-либо дополнительные библиотеки?

ОТВЕТЫ

Ответ 1

Вы можете использовать регулярное выражение и удалять не-цифры.

Ответ 2

Здесь более подробное решение. Менее элегантный, но, вероятно, быстрее:

public static String stripNonDigits( final CharSequence input /* inspired by seh comment */) < final StringBuilder sb = new StringBuilder( input.length() /* also inspired by seh comment */); for(int i = 0; i < input.length(); i++)< final char c = input.charAt(i); if(c >47 && c < 58)< sb.append(c); >> return sb.toString(); > 

Тестовый код:

public static void main(final String[] args)

BTW: я не использовал Character.isDigit(ch), потому что он принимает много других символов, кроме 0 — 9.

Ответ 3

public String extractDigits(String src) < StringBuilder builder = new StringBuilder(); for (int i = 0; i < src.length(); i++) < char c = src.charAt(i); if (Character.isDigit(c)) < builder.append(c); >> return builder.toString(); > 

Ответ 4

Использование Google Guava:

CharMatcher.inRange('0','9').retainFrom("123-456-789") 

Использование Прекомпьютерный CharMatcher может еще больше повысить производительность

CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed(); ASCII_DIGITS.retainFrom("123-456-789"); 

Ответ 5

Это будет игнорировать десятичные точки.

например: если у вас есть вход как 445.3kg , выход будет 445.3 .

Ответ 6

Использование Google Guava:

CharMatcher.DIGIT.retainFrom("123-456-789"); 

CharMatcher доступен для подключения и довольно интересен для использования, например, вы можете сделать следующее:

String input = "My phone number is 123-456-789!"; String output = CharMatcher.is('-').or(CharMatcher.DIGIT).retainFrom(input); 

Ответ 7

Используйте регулярное выражение для соответствия вашим требованиям.

String num,num1,num2; String str = "123-456-789"; String regex ="(\\d+)"; Matcher matcher = Pattern.compile( regex ).matcher( str); while (matcher.find( ))

Ответ 8

Я вдохновил код Шона Патрика Флойда и немного переписал его для максимальной производительности, которую я получаю.

public static String stripNonDigitsV2( CharSequence input ) < if (input == null) return null; if ( input.length() == 0 ) return ""; char[] result = new char[input.length()]; int cursor = 0; CharBuffer buffer = CharBuffer.wrap( input ); while ( buffer.hasRemaining() ) < char chr = buffer.get(); if ( chr >47 && chr < 58 ) result[cursor++] = chr; >return new String( result, 0, cursor ); > 

i Тест производительности — очень длинный Строка с минимальными номерами и результат:

  • Исходный код на 25,5% медленнее
  • Подход Guava в 2,5-3 раза медленнее
  • Регулярное выражение с D + в 3-3,5 раза медленнее
  • Регулярное выражение только с D в 25 + раз медленнее

Btw зависит от того, как долго эта строка. С строкой, содержащей только 6 чисел, guava на 50% медленнее, а регулярное выражение — в 1 раз медленнее

Ответ 9

Вы можете использовать str.replaceAll(«[^0-9]», «»);

Ответ 10

public class FindDigitFromString < public static void main(String[] args) < String s=" Hi How Are You 11 "; String s1=s.replaceAll("[^0-9]+", ""); //*replacing all the value of string except digit by using "[^0-9]+" regex.* System.out.println(s1); >> 

Ответ 11

Я завершил код для телефонных номеров +9 (987) 124124.

Юникодовые символы занимают 4 байта.

public static String stripNonDigitsV2( CharSequence input ) < if (input == null) return null; if ( input.length() == 0 ) return ""; char[] result = new char[input.length()]; int cursor = 0; CharBuffer buffer = CharBuffer.wrap( input ); int i=0; while ( i< buffer.length() ) < //buffer.hasRemaining() char chr = buffer.get(i); if (chr=='u')< i=i+5; chr=buffer.get(i); >if ( chr > 39 && chr < 58 ) result[cursor++] = chr; i=i+1; >return new String( result, 0, cursor ); > 

Ответ 12

Ответ 13

import java.util.*; public class FindDigits < public static void main(String []args)< FindDigits h=new FindDigits(); h.checkStringIsNumerical(); >void checkStringIsNumerical() < String h="hello 123 for the rest of the 98475wt355"; for(int i=0;i> > void checkStringIsNumerical2() < String h="hello 123 for 2the rest of the 98475wt355"; for(int i=0;i> > > > 

Источник

Извлечь цифры из строки

Помогите! Необходимо выбрать (в виде списка) из текста все числа. Нужно сделать при помощи цикла без использования регулярных выражений.

Извлечь цифры из текстовой строки
Вечер добрый, очень необходима помощь в написании небольшой программы для извлечения цифр из текста.

Как извлечь только цифры из строки
Есть файл и в нем строки вида 00:00:00,000 —> 00:00:00,200 Нужно извлечь только цифры из каждой.

Извлечь цифры из текстовой строки и просуммировать
Нужно с этой строчки 1-(1X); 2-(1); 3-(X2); 4-(1X); 5-(1X); 6-(1X); 7-(1); 8-(1); 9-(2); 10-(1);.

Извлечь цифры из строки. Регулярные выражения
Друзья, мучаюсь уже несколько часов со следующей задачей Пытаюсь извлечь из строки только цифры. .

Эксперт PythonЭксперт Java

ЦитатаСообщение от Alexandra1234A Посмотреть сообщение

Добавлено через 1 минуту
Alexandra1234A, давай еще пару раз тему создай, чтоб наверняка
Цифры в строке

ЦитатаСообщение от Alexandra1234A Посмотреть сообщение

Добавлено через 15 минут
PS. На самом деле масса вариантов.

Вы можете поискать рекомендации или тестировать сами по быстродействию.
К примеру использовать Google Guava:

CharMatcher.DIGIT.retainFrom("123-456-789");

Лучший ответ

Сообщение было отмечено Alexandra1234A как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import java.nio.CharBuffer; public class Main { public static void main(String[] args) { String str1 = "90090 - hjk- sds"; String str2 = strNonDigits(str1); System.out.print(str2); } public static String strNonDigits(CharSequence in) { if (in == null) return null; if (in.length() == 0) return ""; char[] result = new char[in.length()]; int cursor = 0; CharBuffer buffer = CharBuffer.wrap(in); while (buffer.hasRemaining()) { char chr = buffer.get(); if (chr > 47 && chr  58) result[cursor++] = chr; } return new String(result, 0, cursor); } }

A char buffer.
This class defines four categories of operations upon char buffers:
Absolute and relative get and put methods that read and write single chars;
Relative bulk get methods that transfer contiguous sequences of chars from this buffer into an array; and
Relative bulk put methods that transfer contiguous sequences of chars from a char array, a string, or some other char buffer into this buffer; and
A method for compacting a char buffer.
Char buffers can be created either by allocation, which allocates space for the buffer’s content, by wrapping an existing char array or string into a buffer, or by creating a view of an existing byte buffer.
Like a byte buffer, a char buffer is either direct or non-direct. A char buffer created via the wrap methods of this class will be non-direct. A char buffer created as a view of a byte buffer will be direct if, and only if, the byte buffer itself is direct. Whether or not a char buffer is direct may be determined by invoking the isDirect method.
This class implements the CharSequence interface so that character buffers may be used wherever character sequences are accepted, for example in the regular-expression package java.util.regex.
Methods in this class that do not otherwise have a value to return are specified to return the buffer upon which they are invoked. This allows method invocations to be chained. The sequence of statements

Источник

Оцените статью