кто-то в нём хорошо разбирается, подскажите, пожалуйста:
Хочу с помощью регекспа проверять юзернейм пользователя. Требования такие:
- Длина от 4 до 32 символов
- Может содержать буквы латинского алфавита, цифры 0-9 и знак точки и/или нижнего подчёркивания (но не в начале и не в конце)
- Подряд не может быть 2 и более знака нижнего подчёркивания и/или точки
Например следующие вариант будут валидны:
username
user.name
user_name
А следующие уже не должны проходить проверку:
_username
.username
username_
username.
user..name
user__name
user._name
user_.name
Есть вот такой регексп: ^(?=.{4,32}$)(?![_.])[a-zA-Z0-9._]+(?<![_.])$
Не пойму, как в нём указать, чтобы символы точки или нижнего подчёркивания не могли стоять подряд. Возможно ли это вообще или проще написать отдельную функцию, которая будет проверять на соседство символов?
Look ahead / look behind Но я бы не стал проверять такое регуляркой. Лучше просто алгоритм написать. Он не сложный будет.
Продерживаю https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
Это один из аргументов против Второй аргумент – тяжело понять что происходит. Я не встречал пока лично таких разработчиков, которые бы с первого взгляда поняли регулярку, в отличие от шаблона. Ну и третий аргумент — тяжело поддерживать. Он вытекает из второго. Если поменяются требования к проверке поля, то придётся всю регулярку переписывать.
Обсуждают сегодня