正则表达式电子邮件地址列表解析器不会获取列表中的最后一项

时间:2016-10-26 17:18:58

标签: regex

Here is the regex101 demo

我想解析由各种分隔符分隔的电子邮件地址列表。我正在使用的正则表达式是:

/(\S+?@\S+?\.\S+?)[,|;|\|\s|\n|\r|\t|\0|\b|$]/gmi

问题是,in the example demo above,它没有获取列表中的最后一项。如何获取列表中的最后一个电子邮件地址?

1 个答案:

答案 0 :(得分:1)

您不能在字符类中使用$作为行/字符串终止符,它将被理解为字面上的美元字符:/(\S+?@\S+?\.\S+?)[,|;|\|\s|\n|\r|\t|\0|\b|$]/gmi不起作用,/(\S+?@\S+?\.\S+?)([,|;|\|\s|\n|\r|\t|\0|\b|]|$)/gmi确实

此外,我建议对你的正则表达式进行一些改进:

  • 从字符类中删除管道,除非您要匹配文字管道
  • 从字符类中删除NUL\0)字符。它不仅不会出现在你的字符串中,即使它确实会与$
  • 匹配
  • 从您的角色类中删除换行符和/或停止使用m标记,除非单个地址可以分成多行
  • 停止使用i标志,这不会影响您正在使用的字符类

我也怀疑你想将centralreservation@ramaya;nahotel.com作为有效地址。

总之,我建议您使用[^\s;,@]+@[^\s;,@]+\.[^\s;,@]+,或者更好地停止尝试使用正则表达式验证电子邮件地址,而是使用专门的库。要了解原因,请检查the regex this perl module用于验证电子邮件。它甚至没有完全实现RFC ......

非常感谢Sebastian Proske的帮助。