2015-12-12 55 views
4
正常工作

我有以下代码:正则表达式不是在Android的工作,但在Java中

String compact = Pattern.compile(" *(\\{) *| *(\\}) *").matcher(" { { } } ") 
        .replaceAll("$1$2"); 

在Java中,compact包含{{}} - 这正是我想要的 - 但在Android上,我收到{null{nullnull}null}这使得我疯了。难道我做错了什么?

随着生产线生产Android手机上的相同的结果:

String compact = " { { } } ".replaceAll(" *(\\{) *| *(\\}) *", "$1$2") 

这里是谁想要发挥它的online Java version

如果有帮助,我使用Android Studio中的Mac在jdk1.7.0_79上针对Android SDK 23进行编译。

更新:使用"\\s*(\\{)\\s*|\\s*(\\})\\s*"具有相同的影响。

+0

也许使用\ s为空格? –

+0

@ cricket_007刚刚试过,结果相同 –

+0

@ M-WaJeEh你有机会测试这个吗? – davidcesarino

回答

0

我不能告诉你它在Java中的表现如何,但我可以告诉你为什么它在Android中的行为如此。尽管我可以给出一些关于Java的线索。

当你指挥Matcher#replaceAll(String),类检查是否有find(),如果它确实有一个,它替换掉了针对与更换String您提供的输入匹配。

到目前为止这么好。

但是,如果替换实际上是组的表示,则会采用另一个路由。班级试图找到与该组相对应的内容(请参阅Matcher#appendEvaluated(StringBuffer, String))和append(String)它与内部使用的内部StringBuffer

它通过明确调用方法group(int)来做到这一点。在Java和Android中,此方法的行为是,如果在匹配时没有与给定的组相对应,则它将返回null注意:如果没有匹配,它会抛出异常,而不是只找不到与该组相对应的匹配。例如,像group(int)而没有find()

最后,StringBuffer输出“空” String(字面单词“空”)时,附加一个null对象。所以,对于你所问的每一个不存在的组,当有匹配的时候,它会在它后面加上“null”这个词。

在Java中使用的算法完全不同,并且在replaceAll的情况下具有不同的输出。如果不进行过多测试或修复低效率(对不起,在12月3日凌晨3点浏览它并不能帮助我直接思考),我想你可以在Android中实现与使用什么相同的结果你在Java中使用,这样做,而不是replaceAll

String input = " { { } } "; 
Matcher matcher = Pattern.compile(" *(\\{) *| *(\\}) *").matcher(input); 
while (matcher.find()) { 
    String a = matcher.group(1); // $1 
    String b = matcher.group(2); // $2 
    String replacement = null; 
    if (a != null && b != null) { 
     replacement = a + b; 
    } else if (a != null) { 
     replacement = a; 
    } else if (b != null) { 
     replacement = b; 
    } 
    if (replacement != null) { 
     input = input.replace(matcher.group(), replacement); 
    } 
} 

如果没有,请让我知道。我只做了一些粗略的测试(毕竟是凌晨3点)。

+0

当然,我昨天假设你*没有*足够了解你的输入,以避免仅仅追加'replaceAll(“null”,“”)'到连锁,链条。 – davidcesarino

相关问题