0

我必须通过java替换这个xml字符串的内容

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>

所以,这个字符串是从一个 xml 中获取的,当我获取它时,我得到了这个结果:

<My:tag>value_1 22
value_2 54
value_3 11</My:tag>

如果我尝试通过这种方式替换内容:

String regex =  "(<My:tag>)(.*)(</My:tag>)";
String new_string = old_string.replaceAll(regex,"<My:tag> new_stuff </My:tag>");

我没有结果。我认为是因为&#xA;符号

但是如果我尝试替换没有&#xA;符号的字符串,一切都会好起来的。

建议?谢谢

4

3 回答 3

1

我不是 100% 确定 java regex-engine 是如何工作的,但我无法想象一个实体会导致你的问题。您应该首先尝试简单地删除括号,因为您要替换整个表达式,而不是提取任何内容。

但是,可能导致它的原因是,如果您的实体实际上被转换为换行符,则除非您明确进行多行匹配,否则您的正则表达式可能无法捕获它。你也可以尝试做

[.\n]*

而不是你的

.*

不过,这可能是一个贪婪的竞标,并且回溯到很多匹配器来处理。不幸的是,我没有在这台机器上安装任何 java 的东西,所以我不能真正尝试和测试它。另一种可能性是积极寻找下一个开口尖括号,如下所示:

[^<]* 

编辑:
正如你所建议的,我尝试了你的链接,以下工作完美:

表达:

<My:tag>[^<]*</My:tag>

替换:

<My:tag> new_stuff </My:tag>

测试字符串:

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>
于 2009-02-01T19:53:10.280 回答
1

我不明白为什么它&#xA;本身会导致任何问题——除非它在某个时候被转换为实际的换行符。

如果是这种情况,您需要启用 DOTALL 模式,以便 . 也匹配换行符(默认情况下不匹配)。

要启用 DOTALL,只需从表达式开始(?s)
(如果您创建了一个 Pattern 对象,您也可以将标志传递给它。)

无论如何,试试这个:

String regex =  "(?s)(?<=<(My:tag)>).*?(?=</\1>)";
String new_string = old_string.replaceAll(regex,"new_stuff");


(?s:您还可以使用regex-segment为正则表达式 的特定部分启用它,)例如:

String regex =  "(?<=<(My:tag)>)(?s:.*?)(?=</\1>)";
于 2009-02-01T20:11:09.310 回答
0

我建议使用JDOMDOM4J之类的 XML 库来操作 XML,而不是使用正则表达式。

于 2009-02-01T19:40:39.760 回答