2011-12-13 18 views
19

mam ciąg i gdy próbuję uruchomić metodę replaceAll, otrzymuję ten dziwny błąd:Java String ReplaceAll metoda powodująca błąd nieprawidłowego powtarzania?

String str = "something { } , op"; 
str = str.replaceAll("o", "\n"); // it works fine 
str = str.replaceAll("{", "\n"); // does not work 

i ja się dziwny błąd:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
Illegal repetition { 

Jak mogę zastąpić wystąpień z "{"?

Odpowiedz

32

A { to metaznak regex używany do powtórzeń zasięgu jako {min,max}. Aby dopasować dosłownym { trzeba uciec poprzedzając go z \\:

str = str.replaceAll("\\{", "\n"); // does work 
+0

Być może również zmienić komentarz :) –

+0

@KublaiKhan: :) – codaddict

+0

@codaddict, dziękuję – Johnydep

5

go ucieczki:

str = str.replaceAll("\\{", "\n"); 

Jest to konieczne, ponieważ pierwszy argument replaceAll() jest regular expression i { ma specjalne znaczenie w wyrażeniach regularnych Java (jest to powtórzenie operator, stąd komunikat o błędzie) .

+0

dziękuję bardzo – Johnydep

11

Jeśli naprawdę zamierzają zastąpić pojedynczych znaków i nie regexes (czyli to, co wydaje się chce zrobić tutaj), należy użyj .replace(), a nie .replaceAll(). Pomimo swojej nazwy, .replace() zastąpi WSZYSTKIE wystąpienia, a nie tylko pierwszy.

W przypadku, gdy się zastanawiasz, String implementuje CharSequence, więc .replace("{", "\n") zadziała.

+0

Tak, wiem, ale chciałem wymienić wszystkie wystąpienia. – Johnydep

+1

Tak jak powiedziałem, '.replace()' * zastąpi * wszystkie wystąpienia pomimo swojej nazwy! – fge