正确匹配邮件地址的正则到底应该怎么写?

2014-05-27 16:29:53 +08:00
 9
本来挺有自信的,然后看了这个提问后( http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address ) 就不淡定了。

尤其是看到这一大段的正则( http://ex-parrot.com/~pdw/Mail-RFC822-Address.html ),心中一万只草泥马奔腾而过。

至于其中有个人说的“最靠谱的方法也许是发封邮件给这个邮件地址看有没有回执”,这真的不是搞笑?
4364 次点击
所在节点    问与答
10 条回复
Quaintjade
2014-05-27 16:42:08 +08:00
PHP的话,filter_var($str, FILTER_VALIDATE_EMAIL) 就行,有些东西不必再发明车轮。
Sdhjt
2014-05-27 17:09:12 +08:00
我用的这个:
^\w+([-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

有时候正则没必要完全精确匹配,否则
书写麻烦:LZ举例我就不说明了
无法准确验证:书写复杂的正则,看上去很NB,但很容易误杀,比如你考虑过中文域名么。。。。
效率低下:我试验过,复杂的正则效率非常低。就拿上面的正则来说,是无法判断email地址是否包含下划线,也无法判断email地址长度是否超标的,但是效率可以接受。我测试过用再复杂点的正则去判断,效率反而比用if判断慢几倍。

正则不是万能的,还是用if辅助一下靠谱。
Mutoo
2014-05-27 17:27:23 +08:00
RFC是业界标准,如果你非要用,选这个准没错。
vellow
2014-05-27 17:27:56 +08:00
@Sdhjt 这个貌似不能匹配连续的---,以及IP后缀。如"a--.--a@[13.22.40.1]"
dajiangyou
2014-05-27 17:38:30 +08:00
@vellow IP后缀求科普。。。
Sdhjt
2014-05-27 18:40:58 +08:00
@vellow 连续的-符号是不被允许的,肯定不能匹配。我测了下后缀为IP的情况可以匹配的。
akfish
2014-05-27 19:11:35 +08:00
兼容rfc理论上是没错的,而且也是现成写好的,又不是每次要你背出来。

不过从实用简单的标准来讲,以大多数email服务提供商允许的用户名规则来写表达式就行了,奇葩地址出现概率太低,专门去兼容意义不大。
decken
2014-05-27 19:13:46 +08:00
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

月光博客上的.
chemzqm
2014-05-27 19:23:37 +08:00
/.+\@.+\..+/ 对用户和开发者宽容点吧
wzxjohn
2014-05-27 20:46:50 +08:00
又学到了一招。以后去炫耀一下=。=

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX