我必须通过java
替换这个xml字符串的内容<My:tag>value_1 22
value_2 54
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>");
我没有结果。我认为是因为

符号
但如果我尝试更换没有

符号的字符串,一切都会顺利。
连连呢? 感谢
答案 0 :(得分:1)
我不是100%确定java正则表达式引擎是如何工作的,但我无法想象一个实体会导致你的问题。您应该首先尝试简单地删除括号,因为您要替换整个表达式,而不是提取任何内容。
可能导致它的原因是,如果您的实体实际上已翻译成新行,则可能是您的正则表达式无法捕获它,除非您明确执行多行匹配。你也可以尝试做
[.\n]*
代替你的
.*
这可能是一个贪婪的出价,并且对匹配器的回溯很多。不幸的是,我没有在这台机器上安装任何Java东西,所以我不能真正尝试并测试它。另一种可能性是主动寻找下一个开口角括号,如下:
[^<]*
修改:
正如你的建议,我尝试了你的链接,以下工作完美:
表达:
<My:tag>[^<]*</My:tag>
替换:
<My:tag> new_stuff </My:tag>
测试字符串:
<My:tag>value_1 22
value_2 54
value_3 11</My:tag>
答案 1 :(得分:1)
我不明白为什么

本身会导致任何问题 - 除非它在某个时候被转换为实际换行符。
如果是这种情况,则需要启用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)