android正则表达式替换bug

时间:2013-11-19 16:59:50

标签: java android regex

Android java正则表达式函数的一个非常奇怪的行为:

我正在尝试替换“<file_info.*>”:

<?xml version="1.0" encoding="utf-8"?>
<file_info domain_id="ac-demo" language="en" os="androidtab" version="11" >
     <id string_name="app_name">MobilityPlus</id>
    <!-- general buttons text -->
......

致电:String.replaceAll( "<file_info.*>", "<resources>" ); 我只得到替换部分:

<?xml version="1.0" encoding="utf-8"?>
<resources>

其余的裁剪!!为什么??? 我需要返回整个字符串,只更换搜索过的部分。 使用至少2个在线正则表达式测试人员,并得到我想要的,但在Android / Java中它不会。

这可能意味着什么?在GOOGLE CODE中

有关如何解决此问题的任何建议都将非常感谢! 谢谢!

(注意:我尝试使用String.replaceAll()和Pattern + Matcher两者都产生相同的结果。多行标志和不带,甚至在删除所有\t \r {{ 1}} ...字符)

2 个答案:

答案 0 :(得分:2)

使用DOTALL尝试非贪婪量词:

String.replaceAll( "(?s)<file_info.*?>", "<resources>" );

虽然我应该提醒您不要使用正则表达式解析/操作XML

答案 1 :(得分:0)

MULTILINE模式无关紧要,但听起来你有DOTALL模式设置。这允许.匹配行分隔符(\n\r等)。您实际上替换从第一次出现<file_info到文档中最后一次出现>的所有内容。

但是你不能指望XML中存在的那些或任何其他空白字符;他们只是为了让我们的湿品类型更容易阅读它。如果你只想替换一个标签,你应该使用一个否定的字符类,如下所示:

s = s.replaceAll( "<file_info[^>]*>", "<resources>" );