从另一个模型生成的xml字符串将传递给我,它可能包含一些特殊字符,如&在xml标签的文本中 e.g。
<entry>
<key>state</key>
<value xsi:type="xs:string">ADDDRESS 3 & ADDR 4, 12345, HONG KONG</value>
</entry>
当我从字符串构建xml时会出现无效字符错误,所以我需要转义特殊字符&
。
我想使用正则表达式查找&
标记之间的<value></value>
并替换为&
我尝试了一些但是在正则表达式上失败了。
有人能给我一些关于正则表达式的线索吗?
除了我使用Java 1.6
答案 0 :(得分:3)
您可以使用前瞻:
替换
&(?!\w*;)(?=[^<]*</value>)
通过
&
这可以通过指定两个前瞻来实现。第一个前瞻(?!\w*;)
阻止匹配有效的HTML转义序列。第二个预测(?=[^<]*</value>)
指定</value>
标记必须跟随文本(在一些非XML标记内容之后)。
试试here。
答案 1 :(得分:2)
一般来说,XML处理需要一个上下文敏感的语法来进行正确的解析,这在计算上超出了正则表达式的能力,这最多可以解析受离散有限自动机限制的项目。
DFA无法正确解析的一个例子是:
<value xsi:type="xs:string"><value>ADDDRESS 3 & ADDR 4, 12345, HONG KONG</value></value>
因为DFA总是最终回归
<value>ADDDRESS 3 & ADDR 4, 12345, HONG KONG
(or possibly)
""
而下推自动机可以返回两个值(取决于上下文)
<value>ADDDRESS 3 & ADDR 4, 12345, HONG KONG</value>
ADDDRESS 3 & ADDR 4, 12345, HONG KONG
换句话说,除非你喜欢bug,否则不要使用正则表达式来解析XML。而且,就我的意思而言,错误是需要修复的,需要重写所有内容而不使用正则表达式。