根据RFC5321 / RFC5322对电子邮件地址进行正则表达式验证

有谁知道根据RFC5321 / RFC5322验证电子邮件地址的正则表达式吗?

由于(可嵌套的)评论使得语法不规则,所以只应该考虑没有评论的地址。

当然,如果你有兴趣验证某人真正拥有的地址,那么唯一真正的验证是发送一封电子邮件到地址,并检查所有者是否收到该地址。 然而,我纯粹对RFC标准感兴趣。 对于一个实际的方法来说,这个问题更相关。

在评论之上,我愿意牺牲折叠空白,但除此之外,我对拒绝任何RFC5321 / 2有效的地址的表达式不感兴趣。 (可以说,在某些情况下甚至可以忽略折叠空白区域。)

理想情况下,正则表达式会拒绝任何不是RFC有效的东西,但那不重要。 例如,在正则表达式中包含详尽的顶级域列表并不是那么有趣。 只需接受任何顶级域名即可。

我不确定地址标记(例如address+tag@domain.org)是否是我提到的RFC的一部分,但我希望正则表达式来验证这些。

IPv6应该被正确处理(RFC5952)。

据我了解,国际化的电子邮件(RFC6530,RFC6531,RFC6532,RFC6533)仍处于试验阶段,但验证这些地址的表达式也很有趣。

为了让答案普遍有趣,如果任何正则表达式都是POSIX格式,那将会很好。


嵌套评论使得电子邮件地址的语法不规则(上下文无关)。 如果你排除了评论,结果语法是规则的。 主要定义允许(折叠)词汇标记之间的空白(例如a @ b.com )。 删除所有可折叠的空白将导致规范形式。

根据RFC 5322,这是规范电子邮件地址的正则表达式(排除注释):

([!#-'*+/-9=?AZ^-~-]+(.[!#-'*+/-9=?AZ^-~-]+)*|"([]!#-[^-~ t]|([t -~]))+")@([!#-'*+/-9=?AZ^-~-]+(.[!#-'*+/-9=?AZ^-~-]+)*|[[t -Z^-~]*])

如果您需要接受折叠的空格,那么这是根据RFC 5322(排除注释)的电子邮件地址的正则表达式:

((([t ]*rn)?[t ]+)?[-!#-'*+/-9=?AZ^-~]+(.[-!#-'*+/-9=?AZ^-~]+)*(([t ]*rn)?[t ]+)?|(([t ]*rn)?[t ]+)?"(((([t ]*rn)?[t ]+)?([]!#-[^-~]|([t -~])))+(([t ]*rn)?[t ]+)?|(([t ]*rn)?[t ]+)?)"(([t ]*rn)?[t ]+)?)@((([t ]*rn)?[t ]+)?[-!#-'*+/-9=?AZ^-~]+(.[-!#-'*+/-9=?AZ^-~]+)*(([t ]*rn)?[t ]+)?|(([t ]*rn)?[t ]+)?[((([t ]*rn)?[t ]+)?[!-Z^-~])*(([t ]*rn)?[t ]+)?](([t ]*rn)?[t ]+)?)

RFC 5321(SMTP)中进一步限制了有效的电子邮件地址。 它基本上只保留@ -sign之前的部分,但在@ -sign之后只接受主机名或地址文字。 (“---.---”是有效的点原子,但不是有效的主机名,“[...]”是有效的域文字,但不是有效的地址文字。)

在涉及到主机名和IP地址时,RFC 5321中给出的语法过于宽松。 我冒昧地使用这个草案和RFC 1034(第3.5节)作为指导来“纠正”所讨论的规则。 这是由此产生的正则表达式。

([!#-'*+/-9=?AZ^-~-]+(.[!#-'*+/-9=?AZ^-~-]+)*|"([]!#-[^-~ t]|([t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

所有正则表达式都是POSIX ERE。 最后一个使用负向预测。 请参阅这里了解正则表达式的派生。


更新:

正如Michael Stramel指出RFC822已经过时,请看他的评论。


据我所知RFC822指定电子邮件地址语法。

http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

链接地址: http://www.djcxy.com/p/16521.html

上一篇: Regex validation of email addresses according to RFC5321/RFC5322

下一篇: What is the least bad regex to reject definitely invalid email addresses?