提问人:Charlie Patton 提问时间:4/6/2023 更新时间:4/6/2023 访问量:25
多个正预判断言在 .NET 正则表达式中不匹配
Multiple positive lookahead assertions failing to match in .NET regex
问:
我正在尝试在 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=pass
spf=pass
header.d=relayprovider.net
header.from=example.com
换句话说,当我们收到来自 Example 的群发邮件 (relayprovider.net) 的电子邮件时.com并且该电子邮件通过了 dkim 和 spf 检查。
O365 邮件流规则只允许标头上的单个条件,并且只允许每个匹配条件的语句,我计划使用正则表达式来匹配标头,仅当所有子字符串都存在时,才使用正向前瞻断言来匹配标头。这是我的正则表达式:OR
(?=dkim=pass)(?=spf=pass)(?=header.from=example.com)(?=header.d=relayprovider.net)
当我尝试在据称符合 .NET 的正则表达式测试器中针对上面的示例标头进行测试时,我没有得到匹配。如果我只使用一个断言,比如 或 ,我会得到一个匹配项,但是当我将它们组合在一起时,它不匹配。(?=dkim=pass)
(?=spf=pass)
我做错了什么?
答:
1赞
markalex
4/6/2023
#1
(?=dkim=pass)
需要立即关注上一场比赛。与所有其他你的展望一样,它们是相互排斥的。dkim=pass
您需要使用
^(?=.*dkim=pass)(?=.*spf=pass)(?=.*header\.from=example.com)(?=.*header\.d=relayprovider.net)
检查字符串内的任何位置。
另外,为了以防万一,我已经逃脱了你的点。
评论
0赞
Charlie Patton
4/7/2023
为了简化一点,我只尝试了测试字符串,但没有得到匹配。如果我这样做,我就会得到一场比赛。^(?=.*spf=pass)(?=.*dkim=pass)$
^(?=.*spf=pass)$
0赞
Charlie Patton
4/7/2023
编辑:最终起作用的是.将此标记为正确答案。^.*(?=.*spf=pass)(?=.*dkim=pass).*$
1赞
markalex
4/7/2023
@CharliePatton,无法匹配:需要存在,但实际上不匹配任何内容。所以你的正则表达式需要一堆字符串存在,但后来归结为 - 空字符串。你可以看到我的答案在最后缺乏:正是出于这个原因。^(?=.*spf=pass)(?=.*dkim=pass)$
(?=.*spf=pass)
spf=pass
^$
$
0赞
Charlie Patton
4/8/2023
谢谢你的澄清,我现在明白你的意思了。
评论