我见过很多例子,有很多'不,你错过了什么'评论.匹配电子邮件地址的正确方法是什么?
出于Sanity的缘故,只有完全限定的域名,不允许使用@localhost.(或两种方式)
必须允许子域名(issac@deptartment.company.museum)
这个正则表达式符合RFC 2822中描述的语法,它很长,但RFC中描述的语法很复杂......
纯正的正则表达式是不可能的.Regexen无法匹配嵌套括号,完整的RFC规范要求.(关于此事的最新RFC是RFC5322,仅在几个月前发布.)
对电子邮件地址的完全验证需要一些与CFG相关的内容,还有一些事情要警惕; 例如,电子邮件地址可以包含'\0'
空字符...因此您不能在它们上使用任何C的普通字符串函数.
我实际上感觉有点奇怪回答一个问题,并附有我写的东西的链接,但事实上,我有一个我之前准备的:一个简短的(据我所知)完全兼容的验证器,在Haskell ; 你可以在这里看到源代码.我想这些代码可以很容易地移植到任何类似的解析库(也许是C++的Boost.Spirit),或者很容易从另一种语言中挂钩(Haskell有一种非常简单的方式让C使用Haskell代码,所有东西都可以使用C绑定...)
源代码中也有大量的测试用例(我没有从模块中导出它们),这是由于Dominic Sayers,他在PHP中拥有自己的RFC兼容解析器版本.(有几个测试失败了,但它们比RFC5322指定的更严格,所以我现在很好.)
这是几周前在这里提出来的.它归结为,有许多合法地址,容易正则表达式不匹配.它需要一个真正疯狂的正则表达式来匹配大多数合法地址.即便如此,语法合法的地址并不能保证其背后存在帐户 - 例如,请使用foo@example.invalid.