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

问题描述:

我已经通过Java在java中的字符串替换正则表达式,其中包含` `符号

<My:tag>value_1 22&#xA;value_2 54&#xA;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>"); 

我没有得到任何结果。我认为因为&#xA;符号

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

对此提出建议? 谢谢

+0

Giancarlo:我推荐使用`regex`标签,而不是`regular-expressions`,因为它更受欢迎(因此更多的人会发现你的问题)。 由于有5个标签的限制,并且xA不是人们搜索的特定术语,所以我用`regex`替代了该标签。 – 2009-02-01 20:19:09

我不是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> 

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

+0

如果你只是需要做一些文本操作,JDOM和DOM4J似乎有点矫枉过正。如果你需要做大规模的东西,你是对的,但是对于这个......不。 – falstro 2009-02-01 19:45:08

+0

确切地说,我只需要像这样操作字符串,我不认为这是使用其他库的情况... – Giancarlo 2009-02-01 19:46:38

+0

使用XML库的另一个优点是操作的结果保证是格式良好的XML - 这是(为什么?)XML的重点,不是吗? – 2009-02-02 05:05:41

我不明白为什么&#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>)";