我正在写一个正则表达式来匹配电子邮件地址,但前提是在电子邮件之前没有某个前缀。 (这似乎适用于负面后观后的任何非文字字符串匹配器。)
我尝试过使用负向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的字母。它确实有意义。
有没有办法让负面观察应用于整个捕获组?或者是否应该使用不同的表达方式?
另一个选择是匹配你不想要的东西,并使用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-.]+)