如何使用PCRE正则全局替换<i>Divider</i>标签之后的所有连字符
PCRE正则匹配替换解决方案
可用匹配模式
全局匹配模式如下:/(?:<i>Divider<\/i>|\G(?!^))[^-]*\K-/g
替换目标为 __ 即可。
模式说明
(?:<i>Divider<\/i>|\G(?!^)):定位匹配起点,要么匹配到<i>Divider</i>标签,要么从上一次匹配结束的位置继续匹配,(?!^)避免了字符串开头无Divider时的误匹配[^-]*:匹配两个连字符之间的所有非连字符内容,不纳入最终替换范围\K:重置匹配结果,丢弃之前匹配的所有内容,仅将后续的-作为最终匹配项g:全局匹配标志,替换所有符合条件的连字符
效果验证
输入
a-b-<i>Divider</i>-Any-Text→ 输出a-b-<i>Divider</i>__Any__Text
输入a-b-c-<i>Divider</i>-w-x-y-z→ 输出a-b-c-<i>Divider</i>__w__x__y__z
输入无Divider的文本a-b-c-d-e-f-g-h-i-j→ 无匹配,不做任何替换
常见错误说明
你之前尝试的负向前瞻写法-(?!.*Divider)会误匹配无Divider的文本,原因是没有Divider的场景下所有连字符都满足「后面没有Divider」的条件,自然会全量误替换。本方案通过\G锚点强制所有匹配必须从Divider的位置向后延续,没有Divider时不会触发任何匹配,完全规避了该问题。
内容的提问来源于stack exchange,提问作者evangeline531
相关产品推荐
相关产品推荐

