2016-11-19 312 views
5

我有一個字符串,如s = "abc.def..ghi"。我想替換單個'。'有兩個'。但是,s.replace(".", "..")產生「abc..def .... ghi」。我怎樣才能獲得正確的行爲?我正在尋找的輸出是s = "abc..def..ghi"替換字符串中的字符,Java

回答

6

更換點,只有當它是由兩個字符

String foo = s.replaceAll("(\\w)\\.(\\w)", "$1..$2"); 

或者包圍的@Thilo評論說,只有當它是由兩個非點

包圍
String foo = s.replaceAll("([^.])\\.([^.])", "$1..$2"); 

並且即使點位於t的開始/結束處,用兩個點代替單點他串,使用負前瞻和回顧後: (示例串:.abc.def..ghi.將成爲..abc..def..ghi..

String foo = s.replaceAll("(?<!\\.)\\.(?!\\.)", ".."); 
+0

你能推薦一個好的「正則表達式」資源嗎? – Adam

+2

I tink http://www.regular-expressions.info/雖然看起來不太好,但也不算太壞。但你會發現很多。前瞻/後面解釋在這裏:http://www.regular-expressions.info/lookaround.html @亞當 – baao

-6
s.replace("...",".."); 
s.replace("....",".."); 

取決於輸入可能性..

+0

我的意思是他需要在第一次調用s.replace之後使用這些。另外,他需要對這樣的字符串的輸入流進行一些控制,否則世界上沒有任何解析器可以幫助他。 –

+0

請看看寶寶的答案,並考慮是否要刪除這個答案。 –

3

如果你不知道如何使用正則表達式,然後使用StringTokenizer分割字符串並再次拼接做..

代碼:

public static void main(String[] args) { 
    String s = "abc.def..ghi"; 
    StringTokenizer s2 = new StringTokenizer(s, "."); 
    StringBuilder sb = new StringBuilder(); 


    while(s2.hasMoreTokens()) 
    { 
     sb.append(s2.nextToken().toString()); 
     sb.append(".."); 
    } 
    sb.replace(sb.length()-2, sb.length(), ""); // Just delete an extra .. at the end 

    System.out.println(sb.toString()); 

} 

我知道,相比一行正則表達式的代碼是很大的,但如果您在使用正則表達式的任何麻煩我張貼的情況。如果你認爲它比接受的答案慢,我用System.currentTimeMillis()做了一個開始和結束時間,我的速度更快了。我不知道這個測試是否有例外。

無論如何,我希望它有幫助。

+0

我認爲這不工作,如果你有三個連續點(雖然公平,預期的行爲是不明確的,我假設你想把它們保持爲三個點,而不是將它們變成兩個點)。 – Thilo

+0

@Thilo我嘗試了開始,結束和多點(> 3)之間的點。有效。 – SkrewEverything

+0

@Thilo它是'a..b' – SkrewEverything

2

使用變通一下:

str = str.replaceAll("(?<!\\.)\\.(?!\\.)", "..")(

正則表達式讀作「點,而不是一個點之前,而不是之後點」。這將處理位於開始/結束處和/或由字面上任何其他字符圍繞的點的邊緣情況。

由於四處查看並不會消耗輸入,所以您不必在替換術語中使用反向引用。