电子邮件地址的 PCRE 正则表达式



我尝试创建一个 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"! 我试图接近消极展望,例如检查@是否存在(?

我认为你把它弄得太复杂了。我将通过以下方式简化正则表达式:

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

如果您不想将电子邮件与大写字符匹配,只需将a-zA-Z更改为a-z。我将下划线_添加为地址中可能存在的字符。

如果您认为地址可能不以范围-_+!%内的字符开头,您可以为正则表达式增加一些复杂性,但我认为没有必要。

最新更新