2015-02-17 66 views
2

我不能得到我在這裏失蹤的東西。既replace和從java.lang.StringreplaceAll各自ocurrence之後產生一個問號(?):Java替換/替換所有奇怪的行爲

 String str = "ABCD DKABCED DLS ABC";   
     System.out.println("str='"+str+"'"); 
     System.out.println("str.replaceAll(\"ABC\", \"A\\\\${BC}​\") => " + str.replaceAll("ABC", "A\\${BC}​")); 
     System.out.println("str.replace(\"ABC\", \"A${BC}​\") => " + str.replace("ABC", "A${BC}​")); 

產生以下輸出:

str='ABCD DKABCED DLS ABC' 
str.replaceAll("ABC", "A\\${BC}?") => A${BC}?D DKA${BC}?ED DLS A${BC}? 
str.replace("ABC", "A${BC}?") => A${BC}?D DKA${BC}?ED DLS A${BC}? 

這裏執行的圖像: enter image description here

有人知道爲什麼嗎?

編輯:

只是爲了記錄。問題是,括號後面真的有一個字符。 應對和粘貼到Notepad ++後,我可以看到}?"文本。不在Netbeans。 因此純粹引入了誤會。

+0

你已經完全改變了代碼的問題。輸出不再與代碼匹配。 – 2015-02-17 22:52:33

+0

當你移除'$'時會發生什麼? – Smit 2015-02-17 23:08:12

+0

什麼都沒有,問題在於這個字符。 – Netto 2015-02-17 23:08:55

回答

2

我懷疑這是一個字符編碼問題。當我將代碼粘貼到Eclipse(在Windows上)時,無法保存代碼,抱怨字符集:

某些字符無法使用「Cp1252」字符編碼進行映射。

當我重新輸入它從無到有,問題消失:

String str = "ABCD DKABCED DLS ABC"; 
System.out.println("str='" + str + "'"); 
System.out.println(str.replace("ABC", "A${BC}")); 

產生以下(不含加分):

str='ABCD DKABCED DLS ABC' 
A${BC}D DKA${BC}ED DLS A${BC} 

如果你拿的的hexdump正常的}你得到7d

但在代碼中}的性格,我得到7d e2 80 8b

+0

就是這樣!我複製了我想從電子郵件中替換的字符串,我看不到有一個隱形字符。複製並粘貼到Notepad ++後,我發現它。無論如何感謝我的瘋狂xD。對於沒有意義的問題抱歉。 – Netto 2015-02-17 23:18:04

0

這將是因爲你的替換字符串中有問號。因此,replacereplaceAll只是做你正在告訴他們要做的。

+0

什麼?剛剛意識到System.out.println也產生了一個問號!看代碼,那裏沒有問號! – Netto 2015-02-17 22:53:56

+0

它不會在我的機器上生成問號。確保您將外部字符保存爲UTF-8編碼。 – HavelTheGreat 2015-02-17 22:58:38

+0

以UTF-8編碼的源碼 – Netto 2015-02-17 23:00:19