这个问题没有简单的正则表达式:see
this fully RFC‑822–compliant regex,这是什么不简单。 (它是在语法模式之前写的。)
RFC 5322中规定的语法对于原始正则表达式来说太复杂了。
Perl,PCRE和PHP中更复杂的语法模式可以全部manage to correctly parse RFC 5322 without a hitch.Python和C#也应该能够管理它,但他们使用与前三个语法不同的语法。然而,如果你被迫使用许多不太强大的模式匹配语言之一,那么最好使用一个真正的解析器。
同样重要的是要理解,根据RFC验证它是绝对没有关于该地址是否实际存在于提供的域,或输入地址的人是否是其真正的所有者。人们签署他人,直到邮件列表这种方式所有的时间。修复需要一种类型的验证,其涉及向该地址发送包括确认令牌的消息,该确认令牌意图在与该地址相同的网页中输入。
确认令牌是知道你有进入它的人的地址的唯一方法。这就是为什么大多数邮件列表现在使用该机制来确认注册。毕竟,任何人都可以放下president@whitehouse.gov,甚至会解析为法律,但它不可能是另一端的人。
There is some danger that common usage and widespread sloppy coding will establish a de facto standard for e-mail addresses that is more restrictive than the recorded formal standard.
这不比所有其他非RFC模式更好。它甚至不够聪明,甚至不能处理甚至RFC 822,更不用说RFC 5322. This one,是。
如果你想得到花哨和pedantic,implement a complete state engine.正则表达式只能作为一个初步的过滤器。正则表达式的问题是告诉别人他们完全有效的电子邮件地址是无效的(假阳性),因为你的正则表达式不能处理它从用户的角度来说是粗鲁和无礼。用于该目的的状态引擎可以验证甚至校正电子邮件地址,否则将根据每个RFC拆分电子邮件地址被认为无效。这允许潜在地更愉悦的体验,例如
The specified e-mail address ‘myemail@address,com’ is invalid. Did you mean ‘myemail@address.com’?