/^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[a-z]).{8,}$/
Поясните, как работает данное выражение.
Т.е. визуально данное выражение должно работать так:
-находим символ верхнего регистра
-находим через ряд символов цифру
-находим через ряд символов символ нижнего регистра
А уже после операций просмотра, находим 8 или более символов
Тем не менее, выражение работает корректно, скажем с такой последовательностью: ABCD%^&z9
В чем подвох?
Спустя 8 минут, 52 секунды (28.02.2012 - 22:52) inpost написал(а):
Из гугла? У гугла такая проверка? Какая-то кривая проверка вообще.
Ты искал, как правильно сделать, то почитай учебник какой-нибудь по регулярным выражением, больше пользы будет.
Ты искал, как правильно сделать, то почитай учебник какой-нибудь по регулярным выражением, больше пользы будет.
Спустя 4 минуты, 55 секунд (28.02.2012 - 22:57) h234 написал(а):
Цитата (inpost @ 28.02.2012 - 19:52) |
Из гугла? У гугла такая проверка? Какая-то кривая проверка вообще. Ты искал, как правильно сделать, то почитай учебник какой-нибудь по регулярным выражением, больше пользы будет. |
Я в том смысле, что я где то нагуглил это выражение. Мне не надо проверять пароль. Это все абстрактно. Меня интересует алгоритм работы этого выражения!
Спустя 6 часов, 37 минут (29.02.2012 - 05:34) Visman написал(а):
/^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[a-z]).{8,}$/
Думаю, что данная регулярка подразумевает что в пароле должен быть хотя бы один символ A-Z, хотя бы один символ 0-9 и хотя бы один символ a-z.
Все остальные символы могут быть введены от фонаря ;)
Спустя 2 часа, 21 минута, 28 секунд (29.02.2012 - 07:56) h234 написал(а):
Цитата (Visman @ 29.02.2012 - 02:34) |
Думаю, что данная регулярка подразумевает что в пароле должен быть хотя бы один символ A-Z, хотя бы один символ 0-9 и хотя бы один символ a-z. Все остальные символы могут быть введены от фонаря |
Дак это то да!
Как получается, например, что (?=.*?[A-Z]) подразумевает символ верхнего регистра во всем слове? а не перед восьмисимвольным словом? и как получается, что {8,} применительно ко всему выражению, а не к последней точке?
Спустя 10 минут, 8 секунд (29.02.2012 - 08:06) #8bit написал(а):
Цитата |
В чем подвох? |
Никакого подвоха
^(?=.*?[A-Z])
Начиная от начала строки "смотрит", присутствует ли в выражении символы A-Z
(?=.*?[0-9])
проверяет на цифры 0-9
(?=.*?[a-z])
проверяет на символы в нижнем регистре a-z
.{8,}
собственно, если до данной конструкции все совпало, ищет минимум 8 любых символов
Спустя 4 минуты, 50 секунд (29.02.2012 - 08:11) Visman написал(а):
?= - указывает на то, что мы проверяем символ на положительное совпадение, но не смещаем курсор на следующий символ
.*? - если не ошибаюсь, то это любое кол-во любых символов
[A-Z] - тут уже точно проверяем, что один символ это заглавная буква
Т.е. после этой проверки (?=.*?[A-Z]) курсор остался на нулевой позиции и следующая проверка проверяет строку опять сначала
Подробно по регуляркам тут http://www.pcre.ru/docs/php/text/stdsyntax/
.*? - если не ошибаюсь, то это любое кол-во любых символов
[A-Z] - тут уже точно проверяем, что один символ это заглавная буква
Т.е. после этой проверки (?=.*?[A-Z]) курсор остался на нулевой позиции и следующая проверка проверяет строку опять сначала
Подробно по регуляркам тут http://www.pcre.ru/docs/php/text/stdsyntax/
Спустя 5 минут, 22 секунды (29.02.2012 - 08:16) #8bit написал(а):
(?=...) - позитивная опережающая проверка, она не совпадает ни с какими символами. Она совпадает с местом, т.е. справа от данного места должно быть то-то и то-то. У тебя в выражении это место от начала строки, ^(?=.*?[A-Z]) - перебирает всю строку, пока на наткнется на A-Z и так далее, а перебор символов происходит в .{8,}.
Как-то так.
Как-то так.
Спустя 55 минут, 27 секунд (29.02.2012 - 09:11) h234 написал(а):
Цитата (Visman @ 29.02.2012 - 05:11) |
...но не смещаем курсор на следующий символ... |
Вот она где истина то!!!
Спасибо, разобрался!