使用带有正则表达式的单字符域名验证电子邮件地址

时间:2010-01-06 15:34:01

标签: c# regex email

我有一个正则表达式,我用来验证电子邮件地址。我喜欢这个正则表达式,因为它相当放松,并且已经证明可以很好地工作。

这是正则表达式:

(['\"]{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>

任何帮助都将不胜感激。

此致

瓦西姆

5 个答案:

答案 0 :(得分:5)

正如Luis建议的那样,您可以使用[^\.][\w\.\-]*来匹配domtain名称,但现在它也会匹配john@x.....comjohn@@.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,}