4-значное регулярное выражение, которое может начинаться с 0 - PullRequest
0 голосов
/ 01 сентября 2018
\b(0?[1-9]){4}

У меня есть это регулярное выражение Который может найти

1234 

но не

0123

Находит 01234, что больше 4 цифр

Какая часть моего регулярного выражения неправильна?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Проблема с вашим регулярным выражением в том, что вы указали ? для совпадения 0, что означает ноль или одно совпадение. Таким образом, в результате вы можете сопоставить 5-значные строки (и более крупные).

Проблема в том, что ? дает 0 или 1, а затем ваш 1-9 тест всегда дает 1. Вы делаете совпадение 4 раза, так что вы можете сопоставить что угодно, от 4-значной до 8-значной строки.

Вот гораздо более простая версия, которую вы можете протестировать с помощью https://regexr.com/.

\b[0-9][1-9]{3}\b

Это проверяет 0-9 в первой позиции, а затем 1-9 в следующих 3, как требуется.

Пример вывода

yes: 1234
yes: 0123
no:  01234
no:  12345
no:  0001
yes: 0125
0 голосов
/ 01 сентября 2018

Ваш квантификатор используется для всей группы, поэтому вы также можете сопоставить 01020304 с вашим текущим регулярным выражением.

В данном случае наиболее простым решением кажется чередование:

\b(?:0[1-9]{3}|[1-9]{4})\b

Обратите внимание, что это не будет соответствовать числам, которые имеют 0 внутри, например 3000.

Если, однако, вы просто хотите убедиться, что не соответствует 0000, вы можете вместо этого использовать опережающую информацию

\b(?!0{4})\d{4}\b
...