String.replaceAll bez wyrażenia regularnego


115

Chciałbym zamienić wszystkie wystąpienia podciągu w ciągu, ale String.replaceAll()akceptuje tylko wzorzec. Ciąg, który otrzymałem z poprzedniego dopasowania. Czy jest możliwe dodanie replaceAll()znaków specjalnych do wzorca, który mam, czy też istnieje wersja w innej klasie, która akceptuje ciąg literału zamiast wzorca?


Odpowiedzi:


189

Po prostu użyj String.replace(CharSequence,CharSequence)zamiast replaceAll.


13
To nie zastępuje tylko pierwszego? Dziwne, że nazwali to „replaceAll” zamiast „replaceRegex”.
Urna Magicznej Ośmiornicy

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));zwraca "hi world, hi life, hi you".
Thiago Mata

14
@MagicOctopusUrn: Tak, zgadzam się, że nazewnictwo było bardzo kiepskie - z czasem spowodowało wiele zamieszania.
Jon Skeet

bardzo złe nazewnictwo metod. Dlaczego oni (słońce / wyrocznia) komplikują proste rzeczy
Stunner

93

Metoda dodawania ucieczki to Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

Ale jak mówi Jon, możesz po prostu użyć replace(). Pomimo tego, że różni się od replaceAllnazwy, tak samo zastępuje wszystkie wystąpienia replaceAll().


Działa idealnie, jeśli na przykład masz „$” w dopasowanym łańcuchu znaków.
Julien Lafont,

raczej Pattern.compile (); Pattern.quote () przynosi niepożądane rezultaty
Pavlo Zvarych

@PavloZvarych: Pattern.compile()kompiluje ciąg jako wyrażenie regularne, co oznacza, że ​​znaki specjalne będą miały specjalne znaczenie. Jest to całkowite przeciwieństwo tego, co Pattern.quote()robi io co prosił OP ( quote()mówi: „potraktuj ciąg jako literał”). Może mógłbyś rozwinąć, o jakich „niepożądanych skutkach” mówisz.
Mark Peters

@MarkPeters to było coś w stylu \\ G1 \\ G za „1 $”
Pavlo Zvarych,

1
@PavloZvarych: Jeśli próbujesz zacytować zamiennik (a nie wzorzec wyszukiwania), chcesz użyć Matcher.quoteReplacement("$aa +"). Pattern.compile()produkuje a Pattern, a nie a String, więc nie jest dla mnie jasne, w jaki sposób go używasz replaceAll.
Mark Peters
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.