仅在不存在已知前缀的情况下匹配电子邮件地址

问题描述 投票:3回答:2

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

我尝试过使用负向lookbehind,但只有成功设法与电子邮件地址的第一个字符不匹配(如果前缀存在)。

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

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

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

这不应该与地址匹配

18.4.2019 9:35:02.115(22)->:From: [email protected]

这应该与地址匹配

RCPT TO:<[email protected]>

我尝试的正则表达式做了什么,它正确匹配没有前缀的电子邮件地址,但在前缀情况下它也匹配它们,除了第一个字母,它显然是唯一匹配负面lookbehind的字母。它确实有意义。

有没有办法让负面观察应用于整个捕获组?或者是否应该使用不同的表达方式?

c# regex lookbehind
2个回答
1
投票

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

(?<!From: .*)

Demo


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

© www.soinside.com 2019 - 2024. All rights reserved.