2011-06-02 127 views
16
String delimiter = "\\*\\*"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Entry<String, String> entry : mp.entrySet()) { 
    html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

通常應該替換這兩個字符串,但它不會。有沒有人有想法?Java字符串替換不工作

+1

你怎麼知道它不工作?您不打印或將其存儲在任何地方。 – CoolBeans 2011-06-02 19:21:47

回答

47

字符串是不可變的,這意味着html引用不會改變,而replace方法會返回一個新的必須分配的String對象。

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
+0

剛剛測試過,但沒有成功..新的字符串不會被替換。 - 編輯:在我調整了分隔符後,變得非常有趣。 – Vilius 2011-06-02 19:23:29

+0

這是正確的答案。 – codingscientist 2014-01-16 07:00:06

+0

不變性是罪魁禍首! – 2014-08-13 11:18:56

6

替換方法返回您的結果,你丟棄。

4

您不需要轉義*字符。 replacereplaceAll之間的區別就是replace自動轉義任何正則表達式的元字符爲我們:

String delimiter = "**"; 
+0

非常感謝 - 我不得不把你的提示與Yishai之一合併。 – Vilius 2011-06-02 19:24:49

1

如說你是丟棄的結果,更換並不需要一個正則表達式只是一個文字字符序列進行更換,所以你不要」噸需要定界符

但和的replaceAll做replaceFirst採取一個正則表達式的字符串(糟糕設計)

逃脫,順便說一句這是建議使用Patter.quote(String)Matcher.quoteReplacement(String)以確保沒有怪異事情是使用正則表達式時發生的事情(這是一個更容易一點,並確保沒有錯誤逃脫字符)

這裏的時候只出現一次,必須更換

String delimiter = "**"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

在這裏發生的時候多次出現必須更換

String delimiter = "**";//unescaped because I'm handling that in my replace 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replaceAll(Pattern.quote(delimiter + entry.getKey()+ delimiter), Matcher.quoteReplacement(entry.getValue())); 
} 
+0

這兩個例子完全一樣 – user102008 2011-06-20 09:46:30

1

打個比方:

如果您的桌面上的不變的文件。要進行一些更改,請進行復制和替換。這會導致一種狀態,除非您有備份,否則您無法訪問舊文件。

在大多數計算機語言中以同樣的方式像JavaJavaScriptpythonC#replace方法不替換/修改字符串。它只對前一個字符串進行操作,並返回一個包含所有更改的新字符串。

現在,如果您確實想要存儲更改,則需要在同一個變量(如果您的情況允許)或新變量中獲取返回的字符串。

1

字符串是不可變的類型,所以我們應該新的String對象來保存返回的新的字符串替換法

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());