gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:46:14 24 4
gpt4 key购买 nike

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

由于(可嵌套)注释使语法不规则,因此只应考虑没有注释的地址。

当然,如果您对验证某人实际拥有的地址感兴趣,那么唯一真正的验证是向该地址发送电子邮件并检查所有者是否收到它。然而,我纯粹对 RFC 标准感兴趣。实用方法 this question更相关。

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

理想情况下,正则表达式会拒绝任何非 RFC 有效的内容,但这并不重要。例如,在正则表达式中包含详尽的顶级域列表并不是很有趣。只需接受任何顶级域就足够了。

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

IPv6 应该绝对正确处理( RFC5952 )。

据我所知,国际化电子邮件( RFC6530RFC6531RFC6532RFC6533 )仍处于实验阶段,但验证这些地址的表达式也很有趣。

为了使答案普遍有趣,如果任何正则表达式都是 POSIX 格式,那就太好了。

最佳答案

可嵌套的注释使电子邮件地址的语法变得不规则(无上下文)。但是,如果排除注释,则生成的语法是规则的。主要定义允许(折叠)词法标记之间的空格(例如 a @ b.com )。删除所有折叠空白会产生规范形式。

这是根据 RFC 5322(排除注释)规范电子邮件地址的正则表达式:
([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\[[\t -Z^-~]*])
如果您需要接受折叠空格,那么这是根据 RFC 5322(排除注释)的电子邮件地址的正则表达式:
((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)
RFC 5321 (SMTP) 中进一步限制了有效的电子邮件地址。它基本上不考虑@-sign 之前的部分,但只接受@-sign 之后的主机名或地址文字。 (“---.---”是有效的点原子,但不是有效的主机名,“[...]”是有效的域文字,但不是有效的地址文字。)

当涉及到主机名和 IP 地址时,RFC 5321 中提供的语法过于宽松。我冒昧地使用 this draft“更正”了有问题的规则。和 RFC 1034 (第 3.5 节)作为指导方针。这是生成的正则表达式。
([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \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。最后一个使用负前瞻。见 here对于正则表达式的派生。

关于根据 RFC5321/RFC5322 对电子邮件地址进行正则表达式验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com