求匹配未被另一正则表达式匹配的单个字符的通用正则方案
解决方案
有非常简洁且易移植的方案,核心思路是利用正则引擎的跳过失败标记(PCRE兼容),把需要排除的模式标记为“跳过不匹配”,然后匹配剩余的单个字符:
通用正则模板
<要排除的正则>(*SKIP)(*FAIL)|.
示例验证
当排除模式为
ab时,正则为:ab(*SKIP)(*FAIL)|.匹配字符串
abbacaba时,会跳过两处ab,精准匹配剩余的b、a、c、a,完全符合你的需求。当排除模式改为
abc时,只需替换模板中的排除部分:abc(*SKIP)(*FAIL)|.无需修改其他代码,移植成本极低。
原理说明
<要排除的正则>:匹配你不想纳入结果的目标模式。(*SKIP)(*FAIL):PCRE引擎的特殊标记组合,匹配到目标模式时,(*SKIP)告诉引擎跳过这段文本,(*FAIL)强制当前匹配失败,引擎会直接去处理未被跳过的部分。|.:匹配任意单个未被跳过的字符。
非PCRE环境的替代方案(如JavaScript)
如果你的正则环境不支持(*SKIP)(*FAIL),可以用反向预查结合全局匹配的思路(仅适用于固定长度的排除模式):
(?!^)(?<!abc).
内容的提问来源于stack exchange,提问作者shawn_xu
相关产品推荐
相关产品推荐

