2010-08-31 16 views
6

Quiero que el texto "replaceme" debe ser reemplazado con mis símbolos StringBuffer. Cuando imprimo símbolos, es una cadena válida. Cuando imprimo mi consulta, todavía tiene el texto REPLACEME en lugar de símbolos. ¿Por qué?replaceAll no reemplaza la cadena

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; 
} 

Respuesta

16

Cambio

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

a:

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

cadenas en Java están diseñados para ser immutable.
Es por eso que replaceAll() no puede reemplazar los caracteres en la cadena actual, por lo que debe devolver nueva cadena con los caracteres reemplazados.


Además, si se desea reemplazar simplemente literales y no necesita soporte de la sintaxis de expresiones regulares en lugar de uso replacereplaceAll (apoyo sintaxis de expresiones regulares es única diferencia entre estos dos métodos). Es más seguro en caso de que desee reemplazar los literales que pueden contener metacaracteres regex como *, +, [, ]and others.

+7

También tenga en cuenta que las cadenas son inmutables en Java. NUNCA puedes cambiar una cadena en su lugar. –

6

leer la documentación :) replaceAll() devuelve una nueva cadena, que reemplaza el interior de la cadena existente. La razón de esto es que las cadenas son objetos inmutables.

5

La Cadena objeto en Java es inmutable. El replaceAll no reemplazará los datos en la cadena, generará una nueva cadena. Pruebe esto:

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

+1 por mencionar la inmutabilidad de String. – DJClayworth

Cuestiones relacionadas