正则表达式匹配邮件To与最近Subject字段间的DL关键词
邮件头DL通讯组正则匹配方案
原正则失效原因
之前编写的正则存在匹配范围溢出问题,核心原因有两点:
- 通配部分用了无边界限制的
(?s:.)*?,非贪婪匹配在正则引擎回溯时,会跨越多组To:/Subject:边界,只要能找到后续的Subject:标识就会完成匹配,无法锁定相邻的独立区间 - 没有对区间内的特殊标识做拦截,最终会从全文第一个
To:开始匹配,一直延伸到全文最后一个Subject:,把不该纳入的内容都算进匹配范围
可用正则表达式
直接使用下面的正则即可满足需求:
(?s)(?<=To: )(?:(?!To:|Subject:).)*?(?: DL | DL-)(?:(?!To:|Subject:).)*?(?=Subject:)
匹配逻辑说明
- 后行断言
(?<=To: )定位到To:的结束位置,作为单个匹配区间的起点 - 区间内所有字符匹配都加了负前瞻校验
(?!To:|Subject:),匹配任意字符前先确认当前位置后面不是To:或Subject:标识,从根本上避免跨边界匹配,把范围严格锁死在当前To:和它之后第一个最近的Subject:之间 - 锁定区间后再查找目标关键词
DL或DL-,只会命中收件人、抄送字段范围内的DL通讯组标识 - 先行断言
(?=Subject:)把区间终点卡在Subject:标识的起始位置,完全不会读取主题字段内的内容,自然不会误匹配主题里的DL
效果验证
用给出的示例邮件测试:
From: Mouse, Mickey <JMouse@Disney.com<mailto:JMouse@Disney.com>> Sent: Thursday, May 26, 2022 8:14 AM To: Mouse, Minnie <DMouse@Disney.com<mailto:DMouse@Disney.com>> Cc: Disney, Joseph R <JDisney@Disney.com<mailto:JDisney@Disney.com>> DL-Musketeers@Disney.com Subject: RE: DL commission
- 可以正常命中Cc字段内
DL-Musketeers中的DL- - 不会匹配Subject行“RE: DL commission”里的
DL,因为这部分内容在Subject:标识之后,不在匹配区间内 - 如果邮件存在多组
To:/Subject:块,会逐块在相邻区间内匹配,不会出现跨区间范围过大的问题
内容的提问来源于stack exchange,提问作者DLP_Jeff
相关产品推荐
相关产品推荐

