我有一个正则表达式,我用来验证电子邮件地址。我喜欢这个正则表达式,因为它相当放松,并且已经证明可以很好地工作。
这是正则表达式:
(['\"]{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;这对我来说有点 放松; - )
所以我的问题是负面字符列表部分如何影响我的单字符检查,基本上我正在阅读正则表达式的方式是:“确保这个字符串不以点开头”,但显然它会做更多。 / p>
任何帮助都将不胜感激。
此致
瓦西姆
答案 0 :(得分:5)
正如Luis建议的那样,您可以使用[^\.][\w\.\-]*
来匹配domtain名称,但现在它也会匹配john@x.....com
和john@@.com
等地址。您可能希望确保一次只有一个句点,并且@之后的第一个字符比仅仅不是句点更受限制。
使用以下方式匹配域名和期间(以及子域及其期间):
([\w\-]+\.)+
所以你的模式是:
(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@([\w\-]+\.)+[A-Za-z]{2,}>?
答案 1 :(得分:3)
如果您将[^\.][\w\.\-]+
更改为[^\.][\w\.\-]*
,它将按预期工作!
原因是:[^\.]
将匹配不是点的单个字符(在您的情况下,“x.com”上的“x”,那么您将尝试达到1个或更多字符,并且然后是一个点。你将匹配x之后的点,并且没有更多的点匹配。*将匹配第一个之后的0个或更多个字符,这就是你想要的。
答案 2 :(得分:3)
将量词+(意思是一个或多个)更改为*,表示零或更多。
答案 3 :(得分:0)
将@[^\.][\w\.\-]+
更改为@[^\.][\w\.\-]*
您需要这个的原因是[^\.]
表示匹配不是点的单个字符。现在没有剩下的字符,因此[\w\.\-]+
无法匹配,即使加号需要至少一个字符。将加号更改为星号会修复此问题。
答案 4 :(得分:0)
查看模式中更广泛的背景:
@[^\.][\w\.\-]+\.[A-Za-z]{2,}
因此joe@x.com
,
[^.]
匹配x
[\w.-]+
匹配.
\.
需要一个点,但找到c
将此部分更改为@[^.][\w-]*\.[A-Za-z]{2,}