2012-05-03 79 views
2

我經常在Java中使用方法replace(CharSequence,CharSequence),但今天我遇到了一些我不太瞭解的東西。Java中替換方法的說明

當我這樣做:

"|||".replace("||","| |"); 

爲什麼它會導致:| ||而不是| | |?爲什麼第二個|不能包含兩種模式?

要解決我的問題,我必須寫"|||".replace("||","| |").replace("||","| |");看起來有點多餘。

任何人有一個解釋,以幫助我更好地理解背後的機制?

編輯

所以,有人說,它是在特定的情況下,在javadoc中指定,但它是錯的例子如下:

* The replacement proceeds from the beginning of the string to the end, for 
* example, replacing "aa" with "b" in the string "aaa" will result in 
* "ba" rather than "ab". 

所以這是從我的情況不同,因爲結果「ba」不再與「aa」匹配。而在我的情況下,結果「| ||」仍然包含模式。

+10

注意特定用例是在方法 – Robin

+0

@Robin的javadoc中明確提到沒有看到,我指的是這個文檔http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace%28char,%20char%29他們不應該刪除這個例子... –

+0

你應該閱讀文檔用CharSequence替換方法(你在問題中提到的方法)。在JDK7上它仍然包含這個例子 – Robin

回答

3

這裏有兩件事情可能會導致混淆。首先,replace不會處理相同的字符兩次,所以中間的|只能應用於單個替換。其次,替換不會處理替換字符,因此在第一次替換之後,您將有| ||,但第二次|是第一次替換的一部分。

所以基本上你得到的是一個後更換,你有第一||被替換,其餘的是|不匹配,因此替換已完成。

+0

感謝您的所有答案!我不確定第二個'|'不能包含兩種模式。該文檔給出了示例,但不是此行爲的原因。現在我明白了! –

1

有爲什麼replace()行爲可能你期望的方式分兩種情況:

  1. 它可以考慮重疊的匹配(在你的例子:匹配字符1 & 2,然後2 & 3)。它不這樣做。

  2. 它可以遞歸替換,這意味着由於替換而添加/更改的內容可以進一步匹配。它也不這樣做。

1

該替換開始通過查看您的原始字符串中找到的charsequence,一旦找到,它說,好吧,匹配開始於start並結束於end,讓我們用替換替換該部分,然後繼續尋找從end + 1位置下一場比賽

0

你所尋找的是

"|||".replace("|","| "); 

"|||".replace("|","| ").trim(); 

如果你不想要最後的空間。

我爲什麼讓你自學。提示:搜索正則表達式替換。

+1

我不是在尋找解決方案,而是爲了解釋。這是正確的文件顯示這種情況下,但沒有真正的解釋。 –

1

沒有真正的答案,爲什麼,但它是

"|||".replace("||","| |"); 

不會導致"| | |"一件好事。如果這是結果,則意味着替換也在已經發生替換的字符串的一部分上執行。 這會使寫入無限循環變得非常容易,例如"|".replace("|", "||");會導致"||||||....",直到你的字符串變成這麼大,你用完了內存不足的

+0

+1這是有道理的!否則,他們將不得不執行模式檢查,並在第二個包含第一個模式的情況下拋出異常,在這種情況下。我現在更瞭解它,謝謝! –