Регулярное выражение: заменяет все недопустимые символы пустой строкой

#java #regex

#java #регулярное выражение

Вопрос:

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

Перед десятичной точкой и после десятичной точки у меня может быть любое число, например: 0.0, 1.0, 150.0, 129.000, 200.999, и т.д…

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

 "\d (\.\d )*"
  

Но я хочу создать шаблон регулярных выражений, который я могу использовать для проверки десятичного числа и замены всех недопустимых символов или неожиданных, используя string.replaceAll("regex", value); .

Пожалуйста, проверьте ниже мои тестовые значения и то, что оно должно вернуть в результате, после замены всех недопустимых символов.

 String[] values = {
    "0", // return 0 - valid
    "0.", // return 0. - valid
    "0.0", // return 0.0 - valid
    "0.0.", // return 0.0 - invalid, because we dont expect another decimal point
    "0.00", // return 0.00 - valid
    "0.00.", // return 0.00 - invalid, because we dont expect antoher decimal point
    "0.000", // return 0.000 - valid
    // etc.
    "10.000.", // return 10.000, this case should not be possible to enter because we dont want 2 decimal point so number like  10.000.00 should not be possible
    "0.0/", // return 0.0, invalid -- any kind of character will be replaced with empty
    "0.0@", // return 0.0, invalid -- any kind of character will be replaced with empty
};
  

Комментарии:

1. @SeanBright Ты имел в виду "\d (\.\d )?" , но в моем случае со строковым методом replaceAll это не сработало…

2. Как бы я написал затем правильную проверку и правильную замену, потому что это то, из-за чего я изо всех сил пытаюсь написать регулярное выражение для проверки и замены регулярного выражения (мне это нужно, потому что у меня может не быть включена проверка — бизнес-пример : /)

3. Хорошо, давайте перейдем к главному вопросу, а также к названию этой проблемы, с чем я действительно борюсь. Давайте пропустим проверку. Как я могу адаптировать свое регулярное выражение для замены всех?

4. @SeanBright, на самом деле это удалило все мои десятичные точки. 😀

5. Я опубликую вам результат.

Ответ №1:

Вы можете использовать регулярное выражение D*(d .?d*)D* и заменить его первой группой $1 (ваш действительный номер). Используйте это в findValid() методе:

 public String findValid(String value) {
    return value.replaceAll("\D*(\d \.?\d*)\D*", "$1");
}
  

Теперь вы можете использовать это, чтобы найти допустимое число для значения. Чтобы проверить, является ли входное значение допустимым, вы можете проверить, соответствует ли ввод допустимому значению:

 Arrays.stream(values)
        .forEach(s -> {
            String valid = findValid(s);
            System.out.println(s   " => "   valid   " ("   (valid.equals(s) ? "valid" : "invalid")   ")");
        });
  

Это выведет:

 0 => 0 (valid)
0. => 0. (valid)
0.0 => 0.0 (valid)
0.0. => 0.0 (invalid)
0.00 => 0.00 (valid)
0.00. => 0.00 (invalid)
0.000 => 0.000 (valid)
10.000. => 10.000 (invalid)
0.0/ => 0.0 (invalid)
0.0@ => 0.0 (invalid)