Я пытаюсь создать регулярное выражение 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"! Я пытался обратиться к отрицательному взгляду, чтобы проверить, например, наличие @ например (?