regex - 电子邮件地址的 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" !我试图接近 Negative lookahead 来检查是否存在 @ 例如 (?
解决方案
我觉得你把它弄得太复杂了。我将通过以下方式简化正则表达式:
[-_a-zA-Z0-9.+!%]*@[-_a-zA-Z0-9.]*
如果您不想将电子邮件与大写字符匹配,则只需更改a-zA-Z
为a-z
. 我将下划线添加_
为可以出现在地址中的字符。
如果您认为地址可能不是以 range 内的 char 开头-_+!%
,则可以为正则表达式增加一些复杂性,但我认为没有必要。
推荐阅读
- java - 按钮在 Java 小程序中无法正常工作,仅在最小化或最大化时起作用
- python - 在 Pyspark 中有效计算加权滚动平均值,但有一些注意事项
- html - 减少 li 元素之间的空间
- asp.net - 在 aspx 应用程序中重定向到不同的 url
- visual-studio-code - 值必须匹配正则表达式 '^https?://([^@
- python-3.x - 在 SVC(kernel='linear') 模型中的 tfidfvectorizer 中提取 ngram 的特征重要性
- django - Django 错误:“ForwardManyToOneDescriptor”对象没有属性“全部”
- python - 无法使用 Python、Selenium 启动 Tor:Tor 无法启动
- elasticsearch - 通过多节点集群设置时无法访问 Kibana 中的弹性搜索实例
- php - 尝试使用 openssl_pkcs7_sign 使用 PHP 进行签名