2010-08-31 140 views
6

我希望將文本「REPLACEME」替換爲我的StringBuffer符號。當我打印符號時,它是一個有效的字符串。當我打印我的查詢時,它仍然有文本REPLACEME而不是符號。爲什麼?replaceAll不替換字符串

private String buildQuery(){ 
    String query = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(REPLACEME)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="; 

    deserializeQuotes(); 

    StringBuffer symbols = new StringBuffer(); 
    for(int i = 0; i < quotes.size();i++){ 
     if(i == (quotes.size()-1)) 
      symbols.append("%22" + quotes.get(i).getSymbol() + "%22%"); //end with a quote 
     else 
      symbols.append("%22" + quotes.get(i).getSymbol() + "%22%2C"); 
    } 

    System.out.println("***SYMBOLS***" + symbols.toString()); 
    query.replaceAll("REPLACEME", symbols.toString()); 

    return query; 
} 

回答

16

變化

query.replaceAll("REPLACEME", symbols.toString()); 

到:在Java中

query = query.replaceAll("REPLACEME", symbols.toString()); 

字符串被設計爲​​。
這就是爲什麼replaceAll()不能替換字符中的的當前字符串,所以它必須返回一個新的字符串替換字符。


此外,如果你想簡單地替換文字,不需要正則表達式的語法支持使用replace代替replaceAll(正則表達式語法的支持是這兩種方法之間唯一的區別)。如果您想要替換可包含正則表達式元字符的文字(如*,+, [, ]and others)更安全。

+7

另請注意,字符串在Java中是不可變的。你永遠不能改變一個字符串。 – 2010-08-31 17:44:45

6

閱讀文檔:) replaceAll()返回一個新的字符串,它會替換現有的字符串。原因是字符串是不可變的對象。

5

Java中的String對象是不可變的。 replaceAll不會替換字符串中的數據,它會生成一個新的字符串。試試這個:

query = query.replaceAll("REPLACEME", symbols.toString()); 
+0

+1提到String的不變性。 – DJClayworth 2010-08-31 18:24:51