2010-08-31 4 views
6

Ich möchte, dass der Text "REPLACEME" durch meine StringBuffer-Symbole ersetzt wird. Wenn ich Symbole drucke, handelt es sich um eine gültige Zeichenfolge. Wenn ich meine Abfrage drucke, hat es immer noch den Text REPLACEME anstelle von Symbolen. Warum?replaceAll ersetzt keine Zeichenfolge

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

Antwort

16

ändern

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

zu:

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

Strings in Java immutable sein sollen.
Deshalb replaceAll() nicht den Zeichen in den aktuellen String ersetzen kann, so dass es eine neue Zeichenfolge mit den ersetzten Zeichen zurückgeben muß.


Auch wenn Sie Literale einfach ersetzen wollen und brauchen nicht regex Syntax Unterstützung Verwendung replace statt replaceAll (regex Syntax-Unterstützung ist nur Unterschied zwischen diesen beiden Methoden). Es ist sicherer, wenn Sie Literale ersetzen möchten, die Regex-Metazeichen wie *, +, , ]and others enthalten können.

+7

Beachten Sie auch, Zeichenfolgen sind unveränderlich in Java. Sie können NIE eine Zeichenfolge an Ort und Stelle ändern. –

6

Lesen Sie die Dokumentation :) replaceAll() gibt einen neuen String zurück, er ersetzt den vorhandenen String. Der Grund dafür ist, dass Strings unveränderliche Objekte sind.

5

Das String-Objekt in Java ist unveränderlich. Der replaceAll ersetzt die Daten in der Zeichenfolge nicht, es wird eine neue Zeichenfolge generiert. Versuchen Sie dies:

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

+1 für die Unveränderlichkeit von String zu erwähnen. – DJClayworth

Verwandte Themen