【问题标题】:PCRE Regex for Email Addresses电子邮件地址的 PCRE 正则表达式
【发布时间】:2020-02-09 13:33:38
【问题描述】:

我尝试创建一个 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 “ 还! 我试图接近 Negative lookahead 来检查是否存在 @ 例如 (?

【问题讨论】:

标签: regex pcre


【解决方案1】:

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

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

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

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

【讨论】:

  • myname123@whatever怎么样
  • @Toto myname123@whatever 将被验证。 PO 没有将其作为无效模式的示例。可以在 @ 复杂化正则表达式之后强制存在至少一个点,如下所示:[-_a-zA-Z.+!%]*@[-_a-zA-Z]*\.[-_a-zA-Z.]*
  • 我只是说你不接受名称部分的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2011-10-14
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多