Метасимволы в методе matches

Задача в том, чтобы в строке обнаружить число от 1 до 100. Не могу разобраться, почему нельзя это выразить при помощи num1.matches("[1-100]") Работает это только так: num1.matches("[1-100]?\\d+") .


Ответы (2 шт):

Автор решения: Fleckinger

Дело в том, что диапазон значение обозначаемый как [...] определяет правила для сопоставления одного и только одного символа. Таким образом, все, что вы пишете в скобках, указывает, как сопоставить один символ. Ваш шаблон [1-100] будет соответствовать только символам 1 и 0. Если же вы хотите проверять числа от 1 до 100, то выражение должно выглядеть следующим образом ^[1-9][0-9]?$|^100$.

→ Ссылка
Автор решения: bio-engineer

Если прочитать вашу регулярку то получится следующее: "[1-100]?" - указывает, что вы ищете в этом диапазоне (это не так, на самом деле здесь диапазон 1-1) и это значение может быть одно или может отсутствовать "\d+" - ожидаете что следующий символ будет цифровым один или более раз

Собрав все воедино получится что ваша регулярка будет ловить числа, но все подряд.

"Полезная ссылка на статью по регуляркам"

Если коротко, то вот такое выражение можно использовать для поиска 1-999 - "\b\d{1,3}\b"

для поиска 1-399 "\b[1-3]{0,1}[0-9]{0,1}[0-9]\b"

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

Не усложняйте свой код. Код читается намного чаще, чем пишется.

→ Ссылка