【问题标题】:replaceAll does not replace string [duplicate]replaceAll 不替换字符串 [重复]
【发布时间】:2011-04-06 09:55:46
【问题描述】:

我希望将文本“REPLACEME”替换为我的 StringBuffer 符号。当我打印符号时,它是一个有效的字符串。当我打印我的查询时,它仍然有文本 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;
}

【问题讨论】:

    标签: java android regex string stringbuffer


    【解决方案1】:

    改变

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

    到:

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

    Java 中的字符串被设计为immutable
    这就是为什么replaceAll()不能替换当前字符串in中的字符,所以它必须返回一个替换了字符的new字符串。


    此外,如果您只想替换文字并且不需要正则表达式语法支持,请使用replace 而不是replaceAll(正则表达式语法支持只是这两种方法之间的区别)。如果您想要替换可能包含正则表达式元字符(如*+[]and others)的文字,会更安全。

    【讨论】:

    • 另外请注意,字符串在 Java 中是不可变的。你永远不能改变一个字符串。
    • 我总是忘记这个xD
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • +1 表示字符串的不变性。
      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2016-05-20
      • 2011-05-05
      • 2012-06-10
      相关资源
      最近更新 更多