正则表达式验证国际邮箱

18

不确定是否有可用的解决方案,但是找不到。所以再次询问。

我正在编写一个电子邮件验证器。这应该验证所有格式良好的电子邮件(这只是一个级别的验证来检查电子邮件的良好格式)。现在,由于我的代码是国际代码,因此我应该支持非拉丁字符。如何编写最有效的正则表达式?

国际电子邮件:http://en.wikipedia.org/wiki/International_email

一些示例电子邮件:

  1. 伊昭傑@郵件.商務
  2. राम@मोहन.ईन्फो
  3. юзер@екзампл.ком
  4. θσερ@εχαμπλε.ψομ

它应该能够验证上述所有格式


14
[^\s@]+@[^\s@]+\.[^\s@]+。请不要过于复杂化 - 实际上,确认电子邮件地址是否真正正确的唯一方法是发送电子邮件,因此应该允许宽容处理。 - Patashu
3
不要像通常为英语字符所做的那样,制作一种规则表达式来说明哪些内容被允许。相反,制作一种规则表达式来说明哪些内容被禁止(例如 x@.xyzx@a..bx@-yx@y-x@a--b 等)。 - Déjà vu
我同意ring0的观点。电子邮件地址的完整合法形式实际上无法通过正则表达式进行验证 - 这需要更真实的解析器。我建议您只需清除最常见的遗漏即可。 - jfriend00
@Patashu 不错的选择,但它会传递像 x@a..b 这样的电子邮件地址,这又是无效的。 - KD.
这主要是为了防止用户输错/故意输入错误的数据,此实现中还有其他需要,我无法提供所有细节。 - KD.
显示剩余2条评论
4个回答

9
通过正则表达式进行电子邮件验证宽松的原因是因为这种方法效率不高。虽然存在电子邮件地址语法规范,但用于检查其的正则表达式太长,实际应用不方便。此外,电子邮件服务提供商在实施语法规范时比实际规范更加严格。一个电子邮件可能被认为是有效的,就像规范所说的那样,但根据提供商的标准可能无效。
这也是激活电子邮件存在的原因,因为检查电子邮件是否有效、存在且正在使用的唯一方法是向其发送某些内容,通常是唯一的激活代码或链接。只有当该唯一的激活代码或链接,仅发送到该电子邮件,被使用后,电子邮件才会被视为有效。
在那之前,考虑采用更宽松的方法验证电子邮件,检查用户名、@和域名部分。此外,为什么要使用虚假电子邮件注册呢?如果他们这样做,他们将无法获得激活链接,并且无法继续创建帐户。

这更多是一种实现,用于在提交/放入任何业务逻辑之前检查电子邮件是否格式正确。这与注册无关。 - KD.
@KD在上面的链接中解释了一个99%完美的RegExp以及规范。继续阅读。 - Joseph
1
是的没错。最后那个正则表达式确实很大,但是很好用。但问题是我需要一个甚至支持国际电子邮件地址的正则表达式,比如说伊昭傑@郵件.商務。 - KD.

4

@Patashu 非常感谢。我稍微改进了你的正则表达式,现在它完全符合我的需求:

^([^@\s\."'\(\)\[\]\{\}\\/,:;]+\.)*[^@\s\."'\(\)\[\]\{\}\\/,:;]+@[^@\s\."'\(\)\[\]\{\}\\/,:;]+(\.[^@\s\."'\(\)\[\]\{\}\\/,:;]+)+$

这是一个很大的改进,但至少有一个问题,即您已将撇号 (' ) 从本地部分中排除在有效字符之外。许多真实世界中的名称(例如爱尔兰姓氏)经常包含撇号。 - pattermeister

0

对于Java来说,这个对我来说非常有效。

"^[\\p{L}\\p{N}\\._%+-]+@[\\p{L}\\p{N}\\.\\-]+\\.[\\p{L}]{2,}$"

它不允许在@后面使用IP地址,但是大多数有效的电子邮件地址形式xxx@xxx.TDL可以通过验证。

\p{L}用于验证UTF字母,\p{N}用于验证UTF数字。您可以查看this doc以获取更多信息。


-2

如果您的域名和用户名中没有特殊字符,只有破折号(-)和数字,并且涉及到国家扩展名,那么使用Python可以解决这个问题。

[a-zA-Z0-9.-]+@[a-zA-Z-]+.(com|edu|net)(.([a-z]+))*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接