2016-07-07 4 views
1

Я разработал следующее регулярное выражение, пытающееся совместить строку с хотя бы одной цифрой и хотя бы одним строчным символом.Почему мое регулярное выражение не работает при использовании начала и конца привязок строк?

(?=.*[a-z])(?=.*\d) 

Это, кажется, работает нормально. Например, он соответствует «abc3», а не «abc»

Однако, как только я изменяю регулярное выражение, добавляя начало и конец привязок строк, он перестает работать. Вы знаете, почему?

^(?=.*[a-z])(?=.*\d)$ 
+2

'$' завершает совпадение. Базируем, вы тестируете нижний регистр, цифру и пустую строку вместе, что невозможно ... используйте '^ (? =. * [Az]) (? =. * \ d). * $ '..lookaheads имеют нулевую ширину. Они не потребляют никаких символов. – rock321987

+1

Объяснение приведенных выше комментариев: контрольные * проверки *, но они нет * потреблять * символы. Таким образом, единственное, что фактически соответствует, это '^ $' - пустая строка. Взгляды не срабатывают, потому что они не могут быть «за пределами» конца строки. – usr2564301

ответ

2

$ завершает матч здесь. Итак, вы тестируете в основном для символа в нижнем регистре и цифры (, что нормально). Поскольку точки обзора имеют нулевую ширину, текущая позиция проверки не изменяется (, которая по умолчанию здесь начинается от ^).

После проверки в нижнем регистре и цифры, вы в основном остается ^$ регулярное выражение, которое соответствует пустой строке (запомнить положение соответствия не изменилось из-за нулевой ширины свойство опережающего просмотра).

Это противоречит вашим требованиям (, потому что это уже символ нижнего регистра и цифры. Таким образом, строка не может быть пустой. Это вызывает регулярное выражение на провал)

Вы должны использовать

^(?=.*[a-z])(?=.*\d).*$