用正则表达式验证邮件地址似乎是一件简单的事情,但是如果要完美的验证一个合规的邮件地址,其实也许很复杂。

邮件地址的规范来自于 RFC 5322?。有一个网站 emailregex.com?专门列出各种编程语言下的验证邮件地址的正则表达式,其中很多正则表达式都是我听说过而从未见过的复杂——我想说,做这个网站的程序员是被邮件验证这件事伤害了多深啊!
其实,在产品环境中,一般来说并不需要这么复杂的正则表达式来做到99.99%正确。一般来说,从执行效率和测试覆盖率来说,只需要一个简单的版本即可:
那么下面我们来看看这些更严谨、更复杂的正则表达式吧:
?
由于各种语言对正则表达式的支持不同、语法差异和覆盖率不同,所以,不同语言里面的正则表达式也不同:
?
这个是个简单的版本:
?
这个有点复杂了:
?
?
PHP 的这个版本就更复杂了,覆盖率就更大一些:
?
对与 PHP 的版本,Perl 和 Ruby 表示不服,可以更严谨:
?
上面的版本,嗯,我可以说是天书吗?反正我是没有解读的想法了。当然,新版本的 Perl 语言还有一个更易读的版本(你是说真的么?)?
?
Ruby 表示,其实人家还有个简单版本:
?
这样的版本谁没有啊——.NET 说:
?
用 grep 命令在文件中查找邮件地址,我想你不会写个若干行的正则表达式吧,意思一下就行了:
在 SQL Server 中也是可以用正则表达式的,不过这个代码片段应该是来自某个产品环境中的,所以,还体贴的照顾了那些把邮件地址写错的人:
?
这个是不是有点偷懒?尤其是在那些“复杂”的正则表达式之后:
?
好吧,看来最后也一样懒:
那么,你有没有关于验证邮件地址的正则表达式分享给大家?