我有一个正则表达式,用于验证电子邮件地址。我喜欢此正则表达式,因为它相当放松,并且已经证明可以很好地工作。
这是正则表达式:
(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@[^\.][\w\.\-]+\.[A-Za-z]{2,}>?
好的,基本上您可以扔给它的所有合理有效的电子邮件地址都将得到验证。我知道,即使是一些无效的,也可能会掉线,但这对于我的特定用例来说是可以的。
现在碰巧是joe@x.com无法验证的情况。并猜测x.com实际上是一个存在的域名(由paypall拥有)。
查看验证域名的正则表达式部分:
@[^\.][\w\.\-]+
看起来这应该能够解析x.com域名,但事实并非如此。罪魁祸首是检查域名不能以点开头的部分(例如test @ .test.com)
@[^\.]
如果我删除了正则表达式的[^。]部分,则域名x.com会进行验证,但是现在正则表达式允许以点开头的域名,例如.test.com;。这对我来说有点放松;-)
所以我的问题是,否定字符列表部分如何影响我的单字符检查,基本上我正在阅读正则表达式的方式是:“确保此字符串不以点开头”,但显然它会做得更多。
任何帮助,将不胜感激。
问候,
瓦塞姆
请您参考如下方法:
正如路易斯建议的那样,您可以使用[^\.][\w\.\-]*来匹配domtain名称,但是现在它也将匹配john@x.....com和john@@.com这样的地址。您可能要确保一次只存在一个句点,并且@之后的第一个字符比不仅仅是句点受到更多限制。
使用以下方式匹配域名和期间(以及子域及其期间):
([\w\-]+\.)+
因此,您的模式将是:
(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@([\w\-]+\.)+[A-Za-z]{2,}>?
