Извлечение цифр из строки в Java - PullRequest
185 голосов
/ 27 октября 2010

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

"123-456-789" Я хочу "123456789"

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

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

Ответы [ 13 ]

489 голосов
/ 27 октября 2010

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

str = str.replaceAll("\\D+","");
45 голосов
/ 27 октября 2010

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

public static String stripNonDigits(
            final CharSequence input /* inspired by seh's comment */){
    final StringBuilder sb = new StringBuilder(
            input.length() /* also inspired by seh's 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){
    final String input = "0-123-abc-456-xyz-789";
    final String result = stripNonDigits(input);
    System.out.println(result);
}

Выход:

0123456789

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

21 голосов
/ 27 октября 2010
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();
}
19 голосов
/ 27 октября 2010

Использование 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");
14 голосов
/ 13 апреля 2015
input.replaceAll("[^0-9?!\\.]","")

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

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

11 голосов
/ 27 октября 2010

Использование 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);

output == 123-456-789

6 голосов
/ 07 октября 2012

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

String num,num1,num2;
String str = "123-456-789";
String regex ="(\\d+)";
Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group();     
System.out.print(num);                 
}
4 голосов
/ 12 июля 2016

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

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 );
}

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

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

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

3 голосов
/ 14 августа 2017
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

3 голосов
/ 09 марта 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...