#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-последовательностью…