Regex проверяет только результат захваченной группы - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть это регулярное выражение для определения адреса электронной почты:

(?=.*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)

Требование: Часть перед @ должна содержать не менее одной буквы и иметь длину не менее 8 символов.

Я использую положительный прогноз, чтобы увидеть, содержит ли он букву, но прогноз фактически применяется ко всей строке (часть после @ обычно будет содержать буквы), так что это пройдет

123456789@gmail.com

Итак, вопрос в том, как я могу проверить только результат первой группы захвата (в данном случае 123456789), чтобы увидеть, имеет ли она букву или нет?

1 Ответ

2 голосов
/ 18 апреля 2019

Часть шаблона потребления [a-zA-Z0-9_.+-]{8,} перед @ не совпадает с @, поэтому проверка на будущее должна проверять букву только после 0 или более символов , кроме @.

Использование

(?=[^@]*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)

решит проблему.См. regex demo и Regulex graph :

enter image description here

Вы можете дополнительно оптимизировать шаблон предпросмотра с помощьюуточнение [^@].Например, если вы разрешаете только 0-9_.+-, не считая букв, вы можете написать регулярное выражение как

(?=[0-9_.+-]*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)
    ^^^^^^^^^

См. это демонстрационное выражение регулярных выражений .

Или вы можете следовать принцип контрастности ( предлагается в комментариях ) и используйте [^@a-zA-Z]* вместо [^@]*.

В зависимости от того, где вы используете регулярное выражение, вы можете захотетьобернуть его якорями ^ и $, чтобы обеспечить полное совпадение строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...