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

Matching an email address only if a known prefix isn't present

我正在编写一个正则表达式来匹配电子邮件地址,但前提是电子邮件前不存在特定前缀。 (这似乎适用于负后视后的任何非文字字符串匹配器。)

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

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

首先,不要介意电子邮件地址匹配器,它很粗糙但在我的用例中有效,这个问题可以适用于任何非文字字符串匹配器,用文字替换捕获组按预期工作.

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

这不应该匹配地址

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

这应该匹配地址

RCPT TO:<address@domain.tld>

我试过的正则表达式的作用是,它正确地匹配了没有前缀的电子邮件地址,但在前缀的情况下它也匹配了它们,除了第一个字母显然是唯一匹配否定后视的字母。确实有道理。

有没有办法让负面回溯应用到整个捕获组?或者应该用不同的表达方式来解决这个问题?

在 C# 的正则表达式引擎中(在其他引擎中也是如此)允许非固定长度的回溯,所以你只需要稍微修改你的正则表达式,改变你的回溯:

(?<!From: .*)

Demo

另一种选择是使用 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