replaceAll不替换字符串

问题描述:

我希望将文本“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; 
} 

变化

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

阅读文档:) replaceAll()返回一个新的字符串,它会替换现有的字符串。原因是字符串是不可变的对象。

Java中的String对象是不可变的。 replaceAll不会替换字符串中的数据,它会生成一个新的字符串。试试这个:

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

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