Использование регулярного выражения PCRE2 с повторяющимися группами для поиска адресов электронной почты

#regex #repeat #regex-group #kleene-star

Вопрос:

Мне нужно найти все адреса электронной почты с произвольным количеством буквенно-цифровых слов, разделенных точкой. Чтобы проверить регулярное выражение, я использую веб-сайт https://regex101.com/.

Структура допустимых адресов электронной почты такова word1.word2.wordN@word1.word2.wordN.word .

Регулярное выражение /[a-zA-Z0-9.] @[a-zA-Z0-9.] .[a-zA-Z0-9] /gm находит все адреса электронной почты, включенные в строку документа , но также включает недопустимые адреса, такие как ........@....com , если они присутствуют.

Я попытался сгруппировать повторяющиеся части с помощью круглых скобок и звезды Клина, но это приводит к сбою механизма регулярных выражений.

Недопустимое регулярное выражение:

/([a-zA-Z0-9] .?)*[a-zA-Z0-9] @([a-zA-Z0-9] .?)*[a-zA-Z0-9] .[a-zA-Z0-9] /gm

Хотя есть много сообщений, касающихся групп регулярных выражений, я не смог найти объяснения, почему механизм регулярных выражений выходит из строя. Кажется, что двигатель застревает, пытаясь найти совпадение.

Как я могу избежать этой проблемы и каково правильное решение?

Комментарии:

1.Вот так? w (?:. w )*@w (?:. w )* regex101.com/r/pnHwxC/1

Ответ №1:

Я думаю, что главная проблема, которая вызвала у вас проблемы, это:
. (за пределами [] ) соответствует любому символу,
который вы, вероятно, хотели указать . вместо этого (только соответствует буквальному символу точки).

Также нет необходимости делать его необязательным ? , потому что не точечная часть вашего регулярного выражения все равно будет совпадать с буквенно-цифровыми символами.

Я также уменьшил правую часть ( x*x то же x самое, что и), добавил флаг без учета регистра и закончил этим:

 /([a-z0-9] .)*[a-z0-9] @([a-z0-9] .) [a-z0-9] /gmi
 

Комментарии:

1. Спасибо вам за разъяснение! В конце концов, это была просто проблема с escape-последовательностью…