Perl正则:替换XML文本时排除元素及属性内容的问题
XML文本特定词汇替换的正则优化
- 问题:读取XML文件替换特定词汇时,已用负向前后瞻正则排除了XML元素/部分属性内的词汇,但
value="hello there"这类属性值里的目标词汇仍会被误替换,当前正则为:-$fi=~s/(?<!<|\/)(?<!value=")\bis\b(?!=)/iss/g - 优化后的正则:
-$fi=~s/(?<!<|\/)(?<!value=")(?!(?:[^"]|")*")\bis\b(?!=)/iss/g
- 核心逻辑:新增的
(?!(?:[^"]|")*")负向前瞻会检查当前位置到下一个未转义双引号的区间,若属于value="开头的属性值范围,则不匹配目标词汇,彻底避免属性值内的误替换 - 额外提醒:如果XML存在复杂的嵌套转义引号,正则可能仍有局限;结构复杂的XML更建议用专业XML解析库(比如Perl的
XML::LibXML)处理,比正则更可靠
内容的提问来源于stack exchange,提问作者Madsinceborn
相关产品推荐
相关产品推荐

