Ваш ?
означает, что предыдущий элемент не является обязательным.
Это означает, что он может совпадать с «3421», а также «2323som».
Регулярные выражения являются жадными, поэтому они будут стараться, чтобы соответствовать «2378som» вместо того, чтобы просто «2378», если вы их называете на «2378som». Причина, по которой вы не подходите, вероятно, s*
. Это означает, что ноль или более "s". Если вы имеете в виду пробелы, то вы должны использовать (\s)*
.
Таким образом, он должен стать
^([0-9]{4})((\s)*([a-zA-Z]{2}))?$
Проверьте unit tests here, чтобы понять, что это соответствует.
Будьте осторожны, это соответствует только тому, что \s
представляет в среде вашего регулярного выражения (оно может не включать вкладки или другие типы пространств).
То, что вы написали, пытается соответствовать против символа «s» ноль или более раз, таким образом, это жало: «1234sab» действует, как «1234ab». Если вы хотели сопоставить «1234 ab», причина, по которой возвращается только «1234», заключается в том, что «s» отсутствует, поэтому он ищет 2 символа. Вы предоставили 3 символа «ab» (пробел + a + b), вне диапазона [a-zA-Z]
. Таким образом, поскольку второй элемент не сопоставляется (имеет 3 символа, которые вам нужны 2, а пробел не A-Z), ваш ?
игнорирует второй элемент и возвращает первый, эрго «1234».
Я думаю, вы хотите использовать '\ s' вместо' s' для соответствия символам пробела 0+. –
'(\ s * ([a-zA-Z] {2}))' ..remove '?' И использовать '\ s' – rock321987