regex .NET正则表达式中的多个正先行Assert无法匹配

hfsqlsce  于 2023-04-07  发布在  .NET
关注(0)|答案(1)|浏览(117)

我试图在O365中创建一个邮件流规则,它需要匹配Authentication-Results头中的特定元素。下面是一个编辑的示例头:

Authentication-Results: spf=pass (sender IP is 12.34.56.78) smtp.mailfrom=relayprovider.net; dkim=pass (signature was verified) header.d=replayprovider.net;dmarc=none action=none header.from=example.com;compauth=fail reason=001

当所有这些特定的子字符串都存在时,我需要匹配规则:dkim=passspf=passheader.d=relayprovider.netheader.from=example.com
换句话说,当我们收到来自Example.com的批量邮件服务器(relayprovider.net)的电子邮件,并且该电子邮件通过了dkim和spf检查。
O365邮件流规则只允许在邮件头上有一个条件,并且对于每个匹配条件只允许OR语句,我计划使用正则表达式来匹配邮件头,只有当所有子字符串都存在时,才使用正向前瞻Assert来匹配邮件头。下面是我的Regex:
(?=dkim=pass)(?=spf=pass)(?=header.from=example.com)(?=header.d=relayprovider.net)
当我尝试在一个据说是.NET兼容的Regex测试器中对上面的示例头进行测试时,我没有得到匹配。如果我只使用一个Assert,如(?=dkim=pass)(?=spf=pass),我会得到一个匹配,但当我将它们组合在一起时,它就不匹配了。
我做错了什么?

u2nhd7ah

u2nhd7ah1#

(?=dkim=pass)要求dkim=pass紧跟在前一个匹配项之后。与所有其他lookaheads一样,它们是相互排斥的。
你需要用

^(?=.*dkim=pass)(?=.*spf=pass)(?=.*header\.from=example.com)(?=.*header\.d=relayprovider.net)

检查字符串中的任何位置。
另外,我已经避开了你的点,以防万一。

相关问题