2015-12-12 98 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

相關問題