替换java字符串中的正则表达式,其中包含` `符号

时间:2009-02-01 19:33:12

标签: java regex replace

我必须通过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;符号的字符串,一切都会顺利。

连连呢? 感谢

3 个答案:

答案 0 :(得分:1)

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

可能导致它的原因是,如果您的实体实际上已翻译成新行,则可能是您的正则表达式无法捕获它,除非您明确执行多行匹配。你也可以尝试做

[.\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>

答案 1 :(得分:1)

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

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

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

无论如何,试试这个:

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


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

String regex =  "(?<=<(My:tag)>)(?s:.*?)(?=</\1>)";

答案 2 :(得分:0)

我建议使用像JDOMDOM4J这样的XML库来操作XML而不是使用正则表达式。