正则表达式如何绑定匹配的首尾字符串以实现正确搜索替换?
正则配对匹配解决方案
修正方案(适配你的需求)
把两种合法的配对场景拆分为独立正则分支,从根源避免前后缀交叉匹配,适配绝大多数主流正则引擎:
- 搜索正则:
(?:(<CnlNum>)([5-9]\d{2})(</CnlNum>)|(Val\s?\()([5-9]\d{2})(\),\s?))
- 替换规则:
$1$41$2$5$3$6
如果你的正则引擎把$41识别为第41个分组产生歧义,可以改用分组包裹写法:
${1}${4}1${2}${5}${3}${6}
原理说明
两个互斥分支每次只会有一组分组被捕获,未命中分支的分组值为空,拼接后自动生成正确结果:
- 匹配
<CnlNum>xxx</CnlNum>场景时,$4/$5/$6为空,输出结果为<CnlNum>1xxx</CnlNum> - 匹配
Val(xxx),场景时,$1/$2/$3为空,输出结果为Val(1xxx), - 交叉的无效内容
<CnlNum>548),不属于任何一个分支,不会被匹配
通用XML/HTML标签配对方案
如果要适配任意标签的配对匹配需求,可以使用回溯引用语法,保证前后标签完全一致:
<(\w+)>(你的内容匹配规则)</\1>
其中\1是对第一个分组捕获的标签名的引用,只会匹配前后标签完全相同的内容,不会出现交叉配对问题。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

