String.replaceAll senza RegEx


115

Vorrei sostituire tutte le istanze di una sottostringa in una stringa ma String.replaceAll()accetta solo un modello. La stringa che ho ricevuto da una partita precedente. È possibile aggiungere escape al pattern che ho o c'è una versione di replaceAll()un'altra classe che accetta una stringa letterale invece di un pattern?


Risposte:


189

13
Questo non sostituisce solo il primo? Strano che lo chiamassero "replaceAll" invece di "replaceRegex".
Magic Octopus Urn

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

14
@MagicOctopusUrn: Sì, sono d'accordo che era una denominazione molto scarsa - ha causato molta confusione nel tempo.
Jon Skeet

pessima denominazione dei metodi. Perché (sole / oracolo) complicano le cose semplici
Storditore

93

Il metodo per aggiungere escape è Pattern.quote().

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

Ma come dice Jon puoi semplicemente usare replace(). Nonostante il fatto che si discosti dal replaceAllnome, sostituisce tutte le occorrenze proprio come replaceAll().


Funziona perfettamente se hai un "$" nel tuo matchingStr, per esempio.
Julien Lafont

piuttosto Pattern.compile (); Pattern.quote () porta risultati indesiderati
Pavlo Zvarych

@PavloZvarych: Pattern.compile()compila la stringa come un'espressione regolare, il che significa che ai caratteri speciali verrà assegnato un significato speciale. Questo è l'esatto opposto di ciò che Pattern.quote()fa e di ciò che l'OP stava chiedendo ( quote()dice "tratta la stringa come letterale"). Forse potresti approfondire di quali "risultati indesiderabili" stai parlando.
Mark Peters

@MarkPeters era qualcosa come \\ G1 \\ G per "$ 1"
Pavlo Zvarych

1
@PavloZvarych: se stai cercando di citare la sostituzione (e non il modello di ricerca), vuoi usare Matcher.quoteReplacement("$aa +"). Pattern.compile()produce un Pattern, non un String, quindi non mi è chiaro come lo stai usando replaceAll.
Mark Peters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.