#java #regex #pattern-matching #decimal-point
Вопрос:
Мне нужно проверить шаблон чисел с 2 десятичными знаками, после каждой десятичной точки он может содержать только до 2 цифр. Он может содержать целое число только до 4 цифр.
Пример: максимальное значение, которое он может вставить, находится в этом формате yyyy.yy.yy
yyyy - allow without any decimal places
yyyy.y - allow
yyyy.y.y - allow
yyyy.yyy.yy
— не могу разрешить (так как здесь 3 цифры после 1 десятичной запятой)
yyyy.yy.yyy
— не могу разрешить (так как здесь 3 цифры после 2 десятичных знаков)
yyyy.y.yy - (Allow)
yyyy.yy.y - (Allow)
гггг.гг.г — (Разрешить)
полужирная часть позволяет использовать только до 4 цифр.
В настоящее время, если я использую эту проверку ^[0-9]{1,4}(\.[0-9]{0,2})?$
Эта проверка работает для этого правильно.
yyyy.yy - maximum value
Но я хочу подтвердить это yyyy.yy.yy
.Если я использую ^[0-9]{1,4}(\.[0-9]{0,2})(\.[0-9]{0,2})?$
для этого yyyy.yy.yy
он не работает должным образом.
Комментарии:
1. Что именно вы пытаетесь сопоставить здесь?
2. я хочу, чтобы этот формат соответствовал yyyy.yy.yy yyy- (может содержать цифры до 4 цифр. минимум 1 число) .yy (могут быть числа до 2 цифр.)
3. гггг — значение также должно быть доступно для вставки без десятичных знаков
Ответ №1:
Ваше регулярное выражение содержит дублирование. Вы можете добавить квантификатор во вторую группу. Попробуйте это регулярное выражение
^d{1,4}(.d{0,2}){0,2}$
Пример Java
public static void main(String[] args) {
String[] arr = new String[] {"1234", "1234.1.2", "1234.22.22", "1234.2", "1.2.3", // all match
"5.555.5", "55555", "5.55.555"}; // all don't match
for(String s : arr) {
if(s.matches("^\d{1,4}(\.\d{0,2}){0,2}$")) {
System.out.println(s);
}
}
}
Выход
1234
1234.1.2
1234.22.22
1234.2
1.2.3