如何用正则表达式替换XML属性中的未转义嵌套双引号?
用正则转义XML属性中的嵌套双引号
当然可以实现!不过得精准锁定属性值内部的未转义双引号——毕竟我们不能把属性的起始/结束引号也给转义了。
解决方案
我们可以用正向预查来限定匹配范围,确保只替换属性值里的嵌套引号:
正则表达式
(?<="[^"]*)"(?=[^"]*")
替换目标
&quot;
正则逻辑拆解
让我们拆解一下这个正则的各个部分,明白它为什么能精准匹配:
(?<="[^"]*):正向后顾,确保当前引号的前面是属性的起始引号",并且已经进入了属性值内部(跟着0个或多个非引号字符)":就是我们要找的、需要转义的嵌套双引号(?=[^"]*"):正向前瞻,确保当前引号的后面会跟着属性的结束引号"(中间是0个或多个非引号字符)
示例代码(JavaScript)
const originalXml = '<test> <tag1 att1="This has "nested double quotes""> <tag2 att2="This also has a nested " double quotes"></tag2> </tag1> </test>'; const escapedXml = originalXml.replace(/(?<="[^"]*)"(?=[^"]*")/g, '&quot;'); console.log(escapedXml);
运行后输出的结果就是你想要的:
<test> <tag1 att1="This has &quot;nested double quotes&quot;"> <tag2 att2="This also has a nested &quot; double quotes"></tag2> </tag1> </test>
注意事项
- 这个正则仅适用于双引号包裹属性值的场景,如果你的XML里存在单引号属性,需要单独调整规则。
- 正则处理XML有天然局限性:如果遇到CDATA块、注释里的引号,或者属性值本身已经包含转义实体的情况,正则可能会误匹配。如果是生产环境的复杂XML,更推荐用专业的XML解析库(比如Python的
xml.etree、Java的DOM解析器)来处理——毕竟正则不是为解析XML设计的,但针对你给出的简单场景,这个方案完全够用。
内容的提问来源于stack exchange,提问作者revy
相关产品推荐
相关产品推荐

