【问题标题】:android regular expression replace bugandroid正则表达式替换bug
【发布时间】:2013-11-19 16:59:49
【问题描述】:

Android java regex 函数的一个非常奇怪的行为:

我正在尝试将“<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( "&lt;file_info.*&gt;", "&lt;resources&gt;" ); 我只得到 replaced 部分:

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

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

这是否意味着错误?在 GOOGLE 代码中??

任何有关如何解决此问题的建议将不胜感激! 谢谢!

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

【问题讨论】:

  • 目前还不清楚您要做什么,但我非常有信心贪婪的正则表达式不会做任何事情。您确实需要解析 XML。
  • 当你可以在 3 行内完成工作时,为什么还要努力工作(xml 解析,bla bla bla...)?这正是我想要完成的事情。而且似乎正则表达式 Android API 确实是非标准的,或者至少与 Java 标准不同(我知道没有真正的标准..)。这样做的问题是,你不能使用大量的在线正则表达式测试器,否则它们会适合......

标签: java android regex


【解决方案1】:

尝试使用 DOTALL 的非贪婪量词:

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

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

【讨论】:

  • 这似乎是最好的答案,因为贪婪:) 尽管如此,由于我对正则表达式的了解很少,我不明白为什么谷歌不使用 java/perl 标准.. 或者这个是一面旗帜吗?
  • 我相信 Java 正则表达式也会以同样的方式运行。上面的另一种写法是String.replaceAll( "(?s)&lt;file_info[^&gt;]*&gt;", "&lt;resources&gt;" );
  • 您可以检查link 并看到简单的形式“”可以正常工作。与任何其他在线正则表达式测试器相同。这是一个java问题吗?我通常使用与 Perl/标准 RegEx 更兼容的 Qt/C++,所以我可能错了......
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,但这似乎是“贪婪”的事情(我自己不是一个大的 reg-ex pro ......)。但很高兴知道如何在正则表达式中直接设置 DOTALL
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2019-01-24
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多