正则表达式找到特殊字符&在xml标签之间

时间:2013-08-20 03:06:14

标签: java xml regex

从另一个模型生成的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>并替换为&amp;
我尝试了一些但是在正则表达式上失败了。

有人能给我一些关于正则表达式的线索吗?

除了我使用Java 1.6

2 个答案:

答案 0 :(得分:3)

您可以使用前瞻:

替换

&(?!\w*;)(?=[^<]*</value>)

通过

&amp;

这可以通过指定两个前瞻来实现。第一个前瞻(?!\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。而且,就我的意思而言,错误是需要修复的,需要重写所有内容而不使用正则表达式。