PCRE Regex для адресов электронной почты - PullRequest
0 голосов
/ 09 февраля 2020

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

(?:[^\w]|^)([a-z0-9+_\-\.]+[^\.]@(?:[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?)(?:[^\w]|$)

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

very.common@example.com
disposable.style.email.with+symbol@example.com
other.email-with-hyphen@example.coma
fully-qualified-domain@example.com
user.name+tag+sorting@example.com
example-indeed@strange-example.com
mailhost!username@example.org
user%example.com@example.org

Но не недействительные адреса, такие как:

Abc.example.com
A@b@c@example.com
A.....example.com

Так, например, A@b@c@example.com недопустим, но я не хочу, чтобы регулярное выражение также ловило A@b@c@example.com "c@example.com"! Я пытался обратиться к отрицательному взгляду, чтобы проверить, например, наличие @ например (?

1 Ответ

1 голос
/ 09 февраля 2020

Я думаю, вы делаете это слишком сложным. Я бы упростил регулярное выражение следующим образом:

[-_a-zA-Z0-9.+!%]*@[-_a-zA-Z0-9.]*

Если вы не хотите сопоставлять электронные письма с заглавными буквами, просто измените a-zA-Z на a-z. Я добавил подчеркивание _ как символ, который может присутствовать в адресе.

Если вы считаете, что адрес может не начинаться с символа внутри диапазона -_+!%, вы можете добавить некоторую сложность к регулярное выражение, но я не думаю, что это необходимо.

...