regex - 正则表达式匹配不是指定电子邮件地址的第一个电子邮件地址
问题描述
我有一个包含一个或多个电子邮件地址的字符串,我想使用正则表达式来查找不是指定电子邮件地址的第一个电子邮件地址。例如,如果我的字符串包含一个或多个一般形式的电子邮件地址某人@somedomain.com,但也可能包含一个或多个与特定人@anotherdomain.com 完全相同的特定电子邮件地址,我如何找到第一个电子邮件地址匹配第一种形式而不是第二种形式?或者换一种说法,我想要第一个电子邮件地址不是 specificperson@anotherdomain.com。所有电子邮件地址可以按任何顺序排列。
解决方案
匹配任何电子邮件地址的正则表达式是\w+@\w+\.\w{3}
.
然后(在此正则表达式刚刚匹配之后),您可以使用否定的lookbehind来排除“禁止”地址,例如(?<!particularperson@anotherdomain\.com)
.
所以整个正则表达式可以是:
\w+@\w+\.\w{3}(?<!particularperson@anotherdomain\.com)
当然,不确定您的正则表达式是否支持负向回溯(例如 JavaScript 不支持),但您没有指定它。
注意:您不能对禁止地址使用负前瞻,然后使用正则表达式匹配任何地址。原因是在否定前瞻匹配后(找到禁止地址),正则表达式处理器向前移动一个字符并从这个位置开始下一次尝试,这个前瞻将不匹配。因此,匹配任何地址的正则表达式将匹配禁止地址,而不仅仅是第一个字符。
编辑
如果您有可变的最后一部分(.co
和.com
其他部分),请尝试一些不同的方法。
你不能.com?
在后面写例如,因为它不允许可变模式长度。
相反,您可以将否定的lookbehind放在最后一部分
(无论它是什么)之前,并且只检查particularperson
and (在适当的地方anotherdomain
加上@
and )。.
还有两个补充:
- 到目前为止,在你已经 caugt 之后,既不能有 dot 也不能有任何单词 char,所以最后一部分应该是
(?!\.\w)
. - 同样,整个正则表达式应以
\b
, 开头,以单词 boudary 开头
所以修正后的正则表达式可以是:
\b\w+@\w+\.(?<!particularperson@anotherdomain\.)\w{2,3}(?!\.\w)
推荐阅读
- python - 从具有非常嵌套的模块结构的模块导入的 PEP 样式指南
- javascript - Facebook 使用 Open Graph 分享
- symfony - 如何在 Symfony 中覆盖构造函数
- vb.net - 使用字符串列表填充 datagridview
- f# - 如何解决 f# 树的插入功能问题
- sql - 如何将具有重复值的行转换为列?
- docker - 火花泊坞窗图像
- python - Django 视图只呈现一页而不会呈现其余页面
- android - Android 在任何地图应用程序中自动显示从我的位置到给定位置的路线
- c# - 如何将图像从 api 读入 WPF 作为实时视频播放?