Comments 27
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$&^()*])[a-zA-Zа-яА-Я0-9!@#$&^()*]{1,}$
Кстати, может кто сказать, зачем здесь столько positive lookahead и почему они не включают в себя русские буквы?
(?=.*[a-z])
(?=.*[A-Z])
(?=.*[0-9])
(?=.*[!@#$&^()*])
UPD: Поэкспериментировал, понял. Они нужны, чтобы неявно указать, что в пароле должна быть минимум одна латинская буква в нижнем регистре, в верхнем, цифра и спецсимвол. При этом минимальная длина пароля – 1. Ну-ну.
Неплохо бы и в статье объяснить, как эта регулярка работает. :)
UPD: Поэкспериментировал, понял. Они нужны, чтобы неявно указать, что в пароле должна быть минимум одна латинская буква в нижнем регистре, в верхнем, цифра и спецсимвол. При этом минимальная длина пароля – 1. Ну-ну.не минимальная длина пароля, а минимальное количество символов помимо перечисленных, то есть, в совокупности не менее 5 символов?
Хорошо знаю, и стараюсь не использовать. Регэкспы — это язык программирования state-machine, для которой нет ни самодокументирующегося кода, ни тестов, ни адекватной обработки ошибок.
От простого abc.+
легко свалиться до полного треша, потому что каждый шаг осмысленный и простой, а результат — нечитаемый. Ту же state-machine для простых случаев можно спокойно переписать используя возможности языка, а для трудных случаев нужно осознать, что state-machine сложная и требует соответствующих конструкций языка.
То, что кто-то может "прийти и переписать на регэкспах" ничем не отличается от "прийти и переписать на perl'е". Спасибо большое, этот проект пишется не на перле.
Человек же со стороны вообще может принять это за инопланетный язык и начать сторониться аки чумы: «Зачем мне ещё один язык программирования, да к тому же такой сложный?».
Это как раз простой язык — там меньше синтаксических конструкций по сравнению с языком программирования. А вот сам код на этом языке может получится очень громоздким.
Что делать тем, кто слишком далеко от обоих пунктов между ними?
Потом мне стрельнуло и я его заменил на парсер на регулярках — стало вообще красиво. Время шло и потребовалось поддержать еще один формат, который был почти такой же, но слегка отличался. Я потратил два дня в попытках поправить регулярку, чтобы работали и старые тесты и новый формат, и все безрезультатно.
В итоге плюнул, достал старый парсер (до сих пор помню — класс назывался CrazyLogicParser), добавил один if и все завелось и поехало в прод. С тех пор использую регэкспы только для очень простых вещей.
Автор надеюсь продолжит цикл статей )
Замена: $1
Пояснение: в поиске мы ищем «цифра» + «3 цифры подряд». 3 цифры заключены в скобки (группа захвата), при замене мы заменяем найденное по шаблону слово (4 цифры подряд) на заключённое в группу ($1).
Спасибо за статью, очень полезная! К сожалению не могу поставить свой голос, зато могу поблагодарить автора в комментах!
Как перестать бояться и полюбить регулярные выражения