.NET正则多正向预查断言匹配失败:O365邮件流规则排查
问题分析与解决方案
你的正则无法匹配的核心原因是正向预查断言默认从当前匹配位置开始查找,而你写的断言没有允许目标子串前后存在任意字符。
原正则(?=dkim=pass)(?=spf=pass)(?=header.from=example.com)(?=header.d=relayprovider.net)中,每个断言都要求从字符串的同一位置(默认是起始位置)直接紧跟目标子串,但实际spf=pass在开头附近,dkim=pass在后面,不可能同时满足“起始位置后既紧跟spf=pass又紧跟dkim=pass”,所以组合后无匹配结果。
修正后的正则
在每个正向预查断言内部添加.*,允许目标子串出现在字符串的任意位置(不限制顺序),正则如下:
(?=.*dkim=pass)(?=.*spf=pass)(?=.*header.from=example.com)(?=.*header.d=relayprovider.net)
补充说明
- 这个正则完全兼容.NET引擎(O365邮件流规则使用的正则引擎),可以直接在O365的邮件流规则中使用。
- 注意你提供的示例头中
header.d的值是replayprovider.net(拼写为replay),而你的正则中写的是relayprovider.net,如果实际邮件头中的值是前者,需要修正正则中的拼写,否则会匹配失败。
内容的提问来源于stack exchange,提问作者Charlie Patton
相关产品推荐
相关产品推荐

