正则表达式逗号分隔的电子邮件地址

3

我正在尝试让这个正则表达式语句工作。

^([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})+(\s?[,]\s?|$))+$

针对一个逗号分隔的电子邮件字符串在textbox中使用jQuery('#textbox').val();,该值传递到正则表达式语句中查找像这样的字符串的错误:

"test@test.com, test1@test.com,test2@test.com"

但由于某种原因它返回了一个错误。我尝试通过http://regexpal.com/运行它,但我不确定?

NB: 这只是一个基本的客户端测试。我通过.NET4.0在服务器端使用MailClass验证电子邮件 - 所以不要因此责备我。这里的目的是消除简单的错误。

转义版本:

^([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})+(\\s?[,]\\s?|$))+$


7
为什么不直接使用 split(',') 将字符串拆分,然后对每个电子邮件运行一个更简单的正则表达式呢? - Pablo Fernandez
@agent-j - 我没有看到错误 - 问题是正则表达式一直返回上面字符串的错误消息,这没有意义吗?即希望有人确认它不是错误的? - Frederick Thompson
@agent-j - 也添加了转义版本吗? - Frederick Thompson
尝试将正则表达式简化为“test”。这将确保没有什么在内部发生。如果仍然不匹配,则知道问题不在于正则表达式。 - agent-j
在正则表达式中,有很多可以简化的地方,以减少可能出现的问题。如@Pablo所说,也许事先要拆分它;考虑到你最终必须要拆分它,因此你不会做任何额外的工作,只是改变了它的顺序来简化验证。然后,在你的正则表达式中,有两个[a-z0-9-]+(\.[a-z0-9-]+)*,我认为它看起来没问题,但一个更简单的表示相同意思的方法是[\w-][\w.-]*-- 正则表达式越简单,越容易识别问题。(我还假设你将其用作不区分大小写吗?) - Greg Jackson
显示剩余6条评论
1个回答

3
你可以像Pablo所说的那样,首先按逗号分割,然后重复应用正则表达式来验证每个单独的电子邮件,这样可以大大简化事情。你还可以指出其中有问题的电子邮件,但是要注意一个很大的警告。
请看一下文章比较电子邮件地址验证正则表达式中的正则表达式。还有另一个更好的正则表达式,我现在找不到了,但是正确的用于检查电子邮件的正则表达式非常复杂,因为RFC中规定的有效电子邮件地址的规则非常复杂。
在你的正则表达式中,这部分(\.[a-z]{2,3})+引起了我的注意;我经常看到{2,3}表示尝试验证顶级域名,但是(1)你的正则表达式允许一个或多个这些组,(2)你将排除来自诸如.info.museum等域的有效电子邮件地址(许多网站拒绝我的.us地址,因为他们认为只有三个字母的域名是合法的)。
我建议严格拒绝无效地址,同时将最终验证留给服务器,允许基本格式为 (任何内容)@(任何内容).(任何内容) -- 只检查 "at" 和 "dot",当然允许多个点。
编辑:针对“简单”正则表达式的示例。

[^@]+@[^.]+(\.[^.]+)+

这匹配。
  • test@test.com
  • test1@test.com
  • test2@test.com
  • foo@bar.baz.co.uk
  • myname@modern.museum
并且不匹配 foo@this....that 注意:即使这样会拒绝一些有效的电子邮件地址,因为在 @ 左边允许出现任何字符 - 包括另一个 @ - 只要它们都被正确转义。但在我使用电子邮件 25 年中从未见过这种情况发生。

1
太好了,我使用了分割器,用这个更简单的版本进行验证,并且在服务器端仍然通过ASP.NET进行验证 :) 快乐的日子! - Frederick Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接