Pull to refresh

Comments 27

Ну там же язык Мордора, а не эльфийский.
UFO just landed and posted this here
Но не стоит забывать и об обратной стороне медали ;)
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.
А почему ваше регулярное выражение не нашло вот эти повторения:
спойлер
image

Это особенность Notepad++. Если вы присмотритесь, то заметите, что действие происходит на 139 строке в обоих случаях. Оно просто явно показывает, что это два разных вхождения регулярки в строку.

все нашло, просто на одну строку отображает одно совпадение.
это все Line 139
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$&^()*])[a-zA-Zа-яА-Я0-9!@#$&^()*]{1,}$

Кстати, может кто сказать, зачем здесь столько positive lookahead и почему они не включают в себя русские буквы?


(?=.*[a-z])
(?=.*[A-Z])
(?=.*[0-9])
(?=.*[!@#$&^()*])

UPD: Поэкспериментировал, понял. Они нужны, чтобы неявно указать, что в пароле должна быть минимум одна латинская буква в нижнем регистре, в верхнем, цифра и спецсимвол. При этом минимальная длина пароля – 1. Ну-ну.


Неплохо бы и в статье объяснить, как эта регулярка работает. :)

Статья даже не затрагивает жадность, а вы предлагаете разобрать выражение, которое использует т.н. позитивный просмотр вперёд (о котором я узнал только что, в то время как про жадность знаю лет 15-20)
UPD: Поэкспериментировал, понял. Они нужны, чтобы неявно указать, что в пароле должна быть минимум одна латинская буква в нижнем регистре, в верхнем, цифра и спецсимвол. При этом минимальная длина пароля – 1. Ну-ну.
не минимальная длина пароля, а минимальное количество символов помимо перечисленных, то есть, в совокупности не менее 5 символов?
Ну тут смотря как это назвать русским языком. Проверка на длину — тут именно 1 символ или больше, но в строке в любом случае должны быть 4 разных типа символа, а это может быть только в строке из 4-х символов. Так что формально тут «минимальная длина = 1 символ», а фактически не менее 4-х и при этом разных
Точно. Чтобы лучше читалось и не вводило в заблуждение, последний квантификатор лучше заменить на {4,}

Хорошо знаю, и стараюсь не использовать. Регэкспы — это язык программирования state-machine, для которой нет ни самодокументирующегося кода, ни тестов, ни адекватной обработки ошибок.


От простого abc.+ легко свалиться до полного треша, потому что каждый шаг осмысленный и простой, а результат — нечитаемый. Ту же state-machine для простых случаев можно спокойно переписать используя возможности языка, а для трудных случаев нужно осознать, что state-machine сложная и требует соответствующих конструкций языка.


То, что кто-то может "прийти и переписать на регэкспах" ничем не отличается от "прийти и переписать на perl'е". Спасибо большое, этот проект пишется не на перле.

Вообще есть более одного варианта писать регулярки в других форматах. Ну, как и конечный автомат, собственно, можно описать более чем одним способом. Parser Combinators, например. И там с некоторой вероятностью будут и тесты, и обработка ошибок (хотя этот пункт наверное самый нетривиальный). Язык обычно можно описать формально, для этого есть грамматики, и инструменты, а вот что делать если текст не соответствует грамматике — тут уже формализмов маловато, и каждый косячит как умеет.
Согласен, сначала регулярки меня восхищали, т.к. на них можно сдедать короткую магию и сразу решить задачу. Но когда я их стал писать много и очень лаконичные, то туда начала сочиться уже сложная логика, которую не все понимают. Пришёл к тому же, что и вы, использую в крайнем случае, когда без них никак. И обязательно с обширным набором тестов.
Человек же со стороны вообще может принять это за инопланетный язык и начать сторониться аки чумы: «Зачем мне ещё один язык программирования, да к тому же такой сложный?».

Это как раз простой язык — там меньше синтаксических конструкций по сравнению с языком программирования. А вот сам код на этом языке может получится очень громоздким.

Пространства между предпоследним и последним пунктами в голосовалке больше, чем во всех остальных промежутках вместе взятых дважды.
Что делать тем, кто слишком далеко от обоих пунктов между ними?
У меня была своя история с регулярками. Делал как-то парсер для одного финансового формата. Нагородил циклов, строковых функций, плотно обложил тестами и все полетело. Выглядело жутковато, но работало.

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

В итоге плюнул, достал старый парсер (до сих пор помню — класс назывался CrazyLogicParser), добавил один if и все завелось и поехало в прод. С тех пор использую регэкспы только для очень простых вещей.
Спасибо за интересную статью, много разных читал, но всегда было отвращение и непонимание регулярок. После этой хотя-бы начну использовать при поиске.
Благодарю. Для тех кто только начинает знакомиться — отличная статья.
Автор надеюсь продолжит цикл статей )
А можно ли делать замену по регуляркам? Условно говоря, если встретил четыре цифры, то первые три оставь, а четвертую удали.
Поиск: \d(\d{3})
Замена: $1
Пояснение: в поиске мы ищем «цифра» + «3 цифры подряд». 3 цифры заключены в скобки (группа захвата), при замене мы заменяем найденное по шаблону слово (4 цифры подряд) на заключённое в группу ($1).
У меня недостаточно кармы, поэтому отвечу словом «СПАСИБО!»
UFO just landed and posted this here

Спасибо за статью, очень полезная! К сожалению не могу поставить свой голос, зато могу поблагодарить автора в комментах!

Sign up to leave a comment.