Ограничение регулярных выражений повторяющегося подсимвола класса

У меня есть регулярное выражение для фильтрации адресов электронной почты, используемое в Java. Это работает по большей части, за исключением случаев, когда вы пытаетесь ограничить повторяющиеся точки в разделе имени пользователя адреса электронной почты.

Я использую регулярное выражение (с удаленным экранированием) [a-zA-Z0-9\.\_\-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}

Это не улавливает неверный адрес электронной почты, такой как [email protected].. Я пытался применить ограничители к классу [a-zA-Z0-9\.\_\-], но это приводит к сбою на действительных адресах электронной почты.

Мы будем очень признательны за любые мысли.


person supertorqued    schedule 28.03.2018    source источник
comment
Вы пытались найти регулярное выражение электронной почты? наверняка этот вопрос уже задавался бесчисленное количество раз   -  person Patrick Parker    schedule 28.03.2018
comment
У меня есть, на самом деле, именно так я получил базовое регулярное выражение в вопросе.   -  person supertorqued    schedule 28.03.2018


Ответы (1)


Добавьте отрицательный прогноз для двух точек, привязанных к началу:

^(?!.*\.\.)[a-zA-Z0-9._-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}

Это выражение (?!.*\.\.) означает, что следующий текст не содержит 2 точки подряд.

Кстати, вам не нужно экранировать большинство символов, когда они находятся внутри класса символов, включая символы ._-, т.е. [a-zA-Z0-9\.\_\-] совпадает с [a-zA-Z0-9._-] (с той оговоркой, что тире является буквальным тире, когда оно появляется первым или последним ).


Использование просмотра вперед упрощает добавление общих ограничений, и вы можете легко добавить больше, например, чтобы потребовать, чтобы общая длина составляла не менее 10 символов, добавьте (?=.{10}) впереди:

^(?=.{10})(?!.*\.\.)[a-zA-Z0-9\.\_\-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}
person Bohemian♦    schedule 28.03.2018
comment
Отлично спасибо за помощь. Я не думал префикс класса, как вы. Спасибо и за дополнительную информацию. - person supertorqued; 28.03.2018