replaceAll无法替换字符串。

7

我希望用我的StringBuffer符号替换文本“REPLACEME”。当我打印符号时,它是一个有效的字符串。但是当我打印我的查询时,它仍然有文本“REPLACEME”,而不是符号。为什么?

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;
}
3个回答

19

更改

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

至:

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

Java中的字符串被设计为不可变
这就是为什么replaceAll()不能替换当前字符串中的字符,因此它必须返回一个用替换后的字符替换原有字符的字符串。


如果您只想简单地替换文字而不需要正则表达式语法支持,请使用replace而不是replaceAll(这两种方法之间的唯一区别就是正则表达式语法支持)。这样做更安全,以防您想要替换包含正则表达式元字符(如*+[]和其他字符)的文字。


7
请注意,Java中的字符串是不可变的。你永远不能直接改变一个字符串。 - Taylor Leese
我总是忘记这个 xD - MinionAttack

6

请阅读文档 :) replaceAll() 方法返回一个新的字符串,它并不会在现有字符串内替换。这是因为字符串是不可变对象。


5
Java中的String对象是不可变的。replaceAll方法不会替换字符串中的数据,它会生成一个新的字符串。请尝试以下代码:
query = query.replaceAll("REPLACEME", symbols.toString());

+1 提到了字符串的不可变性。 - DJClayworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接