2010-11-05 13 views
5

Sto tentando di sostituire una sottostringa contenente il carattere "$". Sarei felice di sapere perché non ha funzionato in quel modo e come avrebbe funzionato.Sostituire la sottostringa (replaceAll) soluzione alternativa

Grazie, USER_UNKNOWN

public class replaceall { 
    public static void main(String args[]) { 
     String s1= "$foo - bar - bla"; 
     System.out.println("Original string:\n"+s1); 
     String s2 = s1.replaceAll("bar", "this works"); 
     System.out.println("new String:\n"+s2); 
     String s3 = s2.replaceAll("$foo", "damn"); 
     System.out.println("new String:\n"+s3); 
    } 

} 
+0

E cosa stampa? '$ foo - funziona - bla'? – Entity

+0

possibile duplicato di [Backslash problem with String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell

risposta

14

Java's .replaceAll utilizza implicitamente Regex sostituire. Ciò significa che $foo viene interpretato come un modello regex e che $ è speciale nella regex (che significa "fine della stringa").

avete bisogno di sfuggire alla $ come

String s3 = s2.replaceAll("\\$foo", "damn"); 

se la destinazione di una variabile, utilizzare Pattern.quote per sfuggire tutti i caratteri speciali su Java ≥1.5, e se la sostituzione è anche una variabile, utilizzare Matcher.quoteReplacement.

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn")); 

su Java ≥1.5, si potrebbe use .replace instead.

String s3 = s2.replace("$foo", "damn"); 

Risultato: http://www.ideone.com/Jm2c4

+1

Risposta molto buona, ma IMHO stai risolvendo il problema sbagliato. –

+2

Si noti inoltre che la stringa di sostituzione per 'replaceAll()' potrebbe richiedere anche l'escape (con 'Pattern.quoteReplacement()'). – axtavt

+0

@axtavt: buon punto –

5

IIRC, replaceAll prendono una regex: cercare di sfuggire al $, in questo modo:

String s3 = s2.replaceAll("\\$foo", "damn"); 
9

Se non hai bisogno di funzionalità Regex, non utilizzare la versione regex.

Uso String.replace(str, str) invece:

String s = "$$$"; 
String rep = s.replace("$", "€"); 
System.out.println(rep); 
// Output: €€€ 

Riferimento:

+1

+1 - Avevo accettato questa risposta. replaceAll serve per sostituire le corrispondenze di un pattern, sostituirlo per la sostituzione della sequenza char (che è esattamente ciò che vogliamo qui) –

0
public static String safeReplaceAll(String orig, String target, String replacement) { 
    replacement = replacement.replace("$", "\\$"); 
    return orig.replaceAll(target, replacement); 
} 
Problemi correlati