求匹配模式A且不与模式B重叠的通用PCRE正则表达式
通用解决方案
将原表达式中的<...>替换为以下正则代码,即可实现匹配模式A且不与模式B重叠的需求:
(*SKIP)(?&B)(*FAIL)|(?&A)(?<!\K(?&B))|(?<!(?&B)\K)(?&A)
核心逻辑
(*SKIP)(?&B)(*FAIL):先直接排除所有匹配B的文本片段,这些区域不会参与A的匹配。(?&A)(?<!\K(?&B)):匹配A后,反向检查A的结尾是否与B的开头重叠,确保两者没有交叉。(?<!(?&B)\K)(?&A):匹配A前,检查A的开头是否与B的结尾重叠,彻底避免边界交叉。
特殊场景优化
- 如果模式B是固定长度(比如长度为3),可以简化为更高效的写法:
(*SKIP)(?&B)(*FAIL)|(?&A)(?<!.{0,2}(?&B))|(?<!(?&B).{0,2})(?&A) - 如果要求A的内部也完全不包含B的子串,可以在匹配A前增加正向否定环视:
(*SKIP)(?&B)(*FAIL)|(?!(?&B))(?&A)(?<!(?&B))
内容的提问来源于stack exchange,提问作者klee
相关产品推荐
相关产品推荐

