Java String удалить все нечисловые символы


237

Попытка удалить все буквы и символы, которые не являются 0-9 и точка. Я использую, Character.isDigit()но он также удаляет десятичную дробь, как я могу также сохранить десятичную?


4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
растровое изображение

2
Это странный способ сказать это. Разве "все буквы и символы, которые не являются 0-9 и точкой", не эквивалентны более простым "всем символам, которые не являются 0-9 и точкой"? Я имею в виду, что буквы - это символы, которые не являются ни 0-9, ни точкой.
Адам Зальцман,

Ответы:


521

Попробуйте этот код:

String str = "a12.334tyz.78x";
str = str.replaceAll("[^\\d.]", "");

Теперь strбудет содержать "12.334.78".


18
Это также может работать:> str = str.replaceAll ("[\\ D.]", "");
даааааааа ... хамф хамф

1
@ Оскар Лопес: как включить отрицательные числа также? Я имею в виду, я должен заменить все, что не является положительным / отрицательным числом, пустым пробелом. Как это сделать?
Панкадж Сингхал

3
@PankajSinghal просто включите знак минус в регулярное выражение:[^\\d.-]
Оскар Лопес

3
@ дааааахххх..хамфхамф нет, это не сработает. Мы должны свести на нет всю группу (включая цифры и точки), предложенный вами код только отрицает цифры, и результат не будет включать точки, как требуется. Вы проверяли это? используя приведенный выше пример кода, ваш код возвращается "1233478", что неверно.
Оскар Лопес

Очень хорошо работает даже в Android. Спасибо.
juanram0n

98

Я бы использовал регулярное выражение.

String text = "-jaskdh2367sd.27askjdfh23";
String digits = text.replaceAll("[^0-9.]", "");
System.out.println(digits);

печать

2367.2723

Вы могли бы также сохранить -отрицательные числа.


Вы не должны избегать точки в своем регулярном выражении.
Адам Зальцман

Не могли бы вы дать какое-то объяснение, что означает ^и что .означает в этом заявлении?
Мансур Фахад

1
@MansourFahad В регулярном выражении [^средства не эти символы и внутри []а .просто.
Питер Lawrey

1
Так как a .- это просто a aи ничего не значит, я могу просто избавиться от этого?
Мансур Фахад

@MansourFahad, только если вы не хотите, чтобы .s в вашем результате.
методика подписи

44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

результат: 0097-557890-999

если вам также не нужен "-" в строке, вы можете сделать это так:

String phoneNumberstr = "Tel: 00971-55 7890 999";      
String numberRefined = phoneNumberstr.replaceAll("[^0-9]", "");

результат: 0097557890999


Спасибо за великий ответ !! r
Шридутт Котари

20

С гуавой:

String input = "abx123.5";
String result = CharMatcher.inRange('0', '9').or(CharMatcher.is('.')).retainFrom(input);

см. http://code.google.com/p/guava-libraries/wiki/StringsExplained


1
Зачем в мире вам нужна Гуава для такой простой и важной задачи ?!
egorikem

@egorikem если ваш проект уже использует гуавы, вы можете использовать его без каких -либо дополнительных затрат ..
Стан

19
str = str.replaceAll("\\D+","");

Не знаю, почему люди отклонили ваше решение ... Очень помогли мне, спасибо! Голоса вверх!
Зариал

Спасибо Зариал, я вижу, что Роберт действительно отредактировал мой ответ от str = str.replaceAll ("\ D +", ""); to str = str.replaceAll ("\\ D +", ""); ... Так что я допустил эту ошибку, вставив ее в окно редактора StackO. Так что спасибо Роберт за исправление. Теперь это работает!
Angoranator777

это опровергнуто, потому что это репост. Точно такой же ответ уже был подсвечен 5 лет назад !! см. выше: stackoverflow.com/a/10372905/704246
Саад Бенбузид

@ СаадБенбузид, а? как вы определяете точно такой же ответ?
Борис Треухов

2
@SaadBenbouzid 1) это комментарий, а не ответ 2) это совершенно другое регулярное выражение 3) не все ответы, использующие регулярное выражение D, похоже на указание на то, что все ответы на языке C, которые используют, printf()являются дубликатами. Также, если вы видите ответ в комментарии, вы можете попросить мод преобразовать его в ответ или даже добавить ответ самостоятельно - ответы в комментариях не рекомендуются в StackOverlow.
Борис Треухов

6

Простой способ без использования Regex:

Добавление дополнительной проверки символов для точки '.'решит требование:

public static String getOnlyNumerics(String str) {
    if (str == null) {
        return null;
    }
    StringBuffer strBuff = new StringBuffer();
    char c;
    for (int i = 0; i < str.length() ; i++) {
        c = str.charAt(i);
        if (Character.isDigit(c) || c == '.') {
            strBuff.append(c);
        }
    }
    return strBuff.toString();
}

3

Способ заменить его потоком Java 8:

public static void main(String[] args) throws IOException
{
    String test = "ab19198zxncvl1308j10923.";
    StringBuilder result = new StringBuilder();

    test.chars().mapToObj( i-> (char)i ).filter( c -> Character.isDigit(c) || c == '.' ).forEach( c -> result.append(c) );

    System.out.println( result ); //returns 19198.130810923.
}

3

Десятичный разделитель валюты может отличаться от локали к другой. Это всегда опасно считать .разделителем. т.е.

╔════════════════╦═══════════════════╗
    Currency          Sample       
╠════════════════╬═══════════════════╣
 USA             $1,222,333.44 USD 
 United Kingdom  £1.222.333,44 GBP 
 European        1.333.333,44 EUR 
╚════════════════╩═══════════════════╝

Я думаю, что правильный путь:

  • Получить десятичный символ с помощью DecimalFormatSymbols по умолчанию Locale или указанный.
  • Приготовьте шаблон регулярных выражений с десятичным символом, чтобы получить только цифры

И вот как я это решаю:

import java.text.DecimalFormatSymbols;
import java.util.Locale;

код:

    public static String getDigit(String quote, Locale locale) {
    char decimalSeparator;
    if (locale == null) {
        decimalSeparator = new DecimalFormatSymbols().getDecimalSeparator();
    } else {
        decimalSeparator = new DecimalFormatSymbols(locale).getDecimalSeparator();
    }

    String regex = "[^0-9" + decimalSeparator + "]";
    String valueOnlyDigit = quote.replaceAll(regex, "");
    try {
        return valueOnlyDigit;
    } catch (ArithmeticException | NumberFormatException e) {
        Log.e(TAG, "Error in getMoneyAsDecimal", e);
        return null;
    }
    return null;
}

Я надеюсь, что это может помочь ».


3

Для Android люди приходят сюда для Kotlin

val dirtyString = "💰 Account Balance: $-12,345.67"
val cleanString = dirtyString.replace("[^\\d.]".toRegex(), "")

Вывод:

cleanString = "12345.67"

Это может быть затем безопасно конвертированы toDouble(), toFloat()или toInt()при необходимости


Или номер, на чистой Java.
Алекс Бирт

1

Это обрабатывает нулевые входные данные, отрицательные числа и десятичные числа (вам необходимо включить библиотеку Apache Commons Lang версии 3.8 или выше в ваш проект):

import org.apache.commons.lang3.RegExUtils;
result = RegExUtils.removeAll(input, "-?[^\\d.]");

Ссылка на библиотеку: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.