首页 > 解决方案 > 正则表达式匹配不是指定电子邮件地址的第一个电子邮件地址

问题描述

我有一个包含一个或多个电子邮件地址的字符串,我想使用正则表达式来查找不是指定电子邮件地址的第一个电子邮件地址。例如,如果我的字符串包含一个或多个一般形式的电子邮件地址某人@somedomain.com,但也可能包含一个或多个与特定人@anotherdomain.com 完全相同的特定电子邮件地址,我如何找到第一个电子邮件地址匹配第一种形式而不是第二种形式?或者换一种说法,我想要第一个电子邮件地址不是 specificperson@anotherdomain.com。所有电子邮件地址可以按任何顺序排列。

标签: regexemail

解决方案


匹配任何电子邮件地址的正则表达式是\w+@\w+\.\w{3}.

然后(在此正则表达式刚刚匹配之后),您可以使用否定的lookbehind来排除“禁止”地址,例如(?<!particularperson@anotherdomain\.com).

所以整个正则表达式可以是:

\w+@\w+\.\w{3}(?<!particularperson@anotherdomain\.com)

当然,不确定您的正则表达式是否支持负向回溯(例如 JavaScript 不支持),但您没有指定它。

注意:您不能对禁止地址使用负前瞻,然后使用正则表达式匹配任何地址。原因是在否定前瞻匹配后(找到禁止地址),正则表达式处理器向前移动一个字符并从这个位置开始下一次尝试,这个前瞻将不匹配。因此,匹配任何地址的正则表达式将匹配禁止地址,而不仅仅是第一个字符。

编辑

如果您有可变的最后一部分(.co.com其他部分),请尝试一些不同的方法。

你不能.com?在后面写例如,因为它不允许可变模式长度。

相反,您可以将否定的lookbehind放在最后一部分 (无论它是什么)之前,并且只检查particularpersonand (在适当的地方anotherdomain 加上@and )。.

还有两个补充:

  • 到目前为止,在你已经 caugt 之后,既不能有 dot 也不能​​有任何单词 char,所以最后一部分应该是(?!\.\w).
  • 同样,整个正则表达式应以\b, 开头,以单词 boudary 开头

所以修正后的正则表达式可以是:

\b\w+@\w+\.(?<!particularperson@anotherdomain\.)\w{2,3}(?!\.\w)

推荐阅读