仅当不存在已知前缀时才匹配电子邮件地址

时间:2019-04-30 04:45:52

标签: c# regex lookbehind

我正在写一个正则表达式来匹配电子邮件地址,但前提是电子邮件之前没有特定的前缀。 (这似乎适用于任何非文字字符串匹配项,在经过负向后看之后。)

我曾尝试使用负向后看,但只有在存在前缀的情况下,才成功设法不匹配电子邮件地址的第一个字符。

(?<!From: )([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

首先,不要介意电子邮件地址匹配器,它很粗糙,但在我的用例中有效,并且这个问题可能适用于任何非文字字符串-matcher,将捕获组替换为文字可以正常工作。< / p>

如果前缀"From: "前面没有,我希望它匹配的是电子邮件地址。

该地址与地址不符

18.4.2019 9:35:02.115(22)->:From: address@subdomain.domain.tld

这应该与地址匹配

RCPT TO:<address@domain.tld>

我尝试过的正则表达式可以正确匹配不带前缀的电子邮件地址,但是在前缀情况下,它也可以匹配电子邮件地址,除了第一个字母(显然是唯一一个与后面的否定字母匹配)之外。确实有道理。

是否有一种方法可以消除负面印象,从而将其应用于整个捕获群体?还是应该用另一种表达方式来解决?

2 个答案:

答案 0 :(得分:1)

在C#的正则表达式引擎中(以及在其他引擎中),允许使用非固定长度的lookbehinds,因此您只需要稍微修改一下regex,即可改变您的lookbehind:

(?<!From: .*)

Demo

答案 1 :(得分:0)

另一种选择是使用alternation来匹配您不需要的内容并捕获您想要的内容:

what you do not want|(what you do want)

您的模式可能类似于:

From: [a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+|([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

Regex demo