2010-11-05 11 views
5

Próbuję zastąpić ciąg zawierający znak "$". Byłbym zadowolony słuchając, dlaczego to nie działa w ten sposób i jak to działa.Zastąpienie podłańcuchowego zastępowania (zastąpAll)

Dzięki, 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

Co to oznacza? '$ foo - to działa - bla'? – Entity

+0

możliwy duplikat [Backslash problem z String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell

Odpowiedz

14

Java's .replaceAll domyślnie używa regex do zastąpienia. Oznacza to, że $foo jest interpretowany jako wzór regex, a $ jest specjalny w regex (co oznacza "koniec łańcucha").

Musisz uciec $ jak

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

jeśli cel zmienna, należy Pattern.quote ucieczki wszystkie znaki specjalne na Java ≥1.5, a jeśli wymiana jest również zmienna, należy Matcher.quoteReplacement.

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

W przypadku języka Java ≥1.5 można uzyskać use .replace instead.

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

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

+1

Bardzo dobra odpowiedź, ale IMHO rozwiązujesz niewłaściwy problem. –

+2

Należy również zauważyć, że zamiennik dla 'replaceAll()' również może wymagać użycia escaping (z 'Pattern.quoteReplacement()'). – axtavt

+0

@axtavt: dobry punkt –

5

IIRC, replaceAll wziąć regex: Spróbuj uciec z $, w ten sposób:

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

Jeśli nie trzeba Regex funkcjonalność, nie używaj wersji regex.

Zastosowanie String.replace(str, str) zamiast:

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

referencyjny:

+1

+1 - Przyjąłem tę odpowiedź. replaceAll służy do zamiany dopasowań wzorca, zastąpienia dla podstawienia sekwencji znaków (co jest dokładnie tym, czego chcemy tutaj) –

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