0

从另一个模型生成的 xml 字符串将传递给我,它可能在 xml 标记的文本中包含一些特殊字符,例如 &。
例如

<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

4

2 回答 2

3

您可以使用前瞻:

代替

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

经过

&amp;

这通过指定两个前瞻来工作。第一个前瞻(?!\w*;)可防止匹配有效的 HTML 转义序列。第二个前瞻(?=[^<]*</value>)指定</value>标记必须跟随文本(在一定数量的非 XML 标记内容之后)。

在这里试试。

于 2013-08-20T03:13:12.933 回答
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

换句话说,除非您喜欢错误,否则不要使用正则表达式来解析 XML。我所说的错误,我的意思是,非常难以修复的错误,需要重写所有内容以不使用正则表达式。

于 2013-08-20T03:42:02.470 回答