在java中的字符串替换正则表达式,其中包含` `符号
问题描述:
我已经通过Java在java中的字符串替换正则表达式,其中包含` `符号
<My:tag>value_1 22
value_2 54
value_3 11</My:tag>
所以,这个字符串已经从一个XML采取更换此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>");
我没有得到任何结果。我认为因为

符号
但如果我尝试替换字符串没有

符号,一切都很好。
对此提出建议? 谢谢
答
我不是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>
答
我不明白为什么

本身会造成什么问题 - 除非没有它得到在某个时候转化为实际的换行符。
如果是这种情况,则需要启用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>)";
Giancarlo:我推荐使用`regex`标签,而不是`regular-expressions`,因为它更受欢迎(因此更多的人会发现你的问题)。 由于有5个标签的限制,并且xA不是人们搜索的特定术语,所以我用`regex`替代了该标签。 – 2009-02-01 20:19:09