#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)