String.replaceAll sin RegEx

115

Me gustaría reemplazar todas las instancias de una subcadena en una cadena, pero String.replaceAll()solo acepta un patrón. La cadena que tengo vino de un partido anterior. ¿Es posible agregar escapes al patrón que tengo o hay una versión de replaceAll()en otra clase que acepta una cadena literal en lugar de un patrón?

dromodelo
fuente
posible duplicado del problema
McDowell

Respuestas:

189

Solo use en String.replace(CharSequence,CharSequence)lugar de replaceAll.

Jon Skeet
fuente
13
¿Esto no solo reemplaza al primero? Es extraño que lo llamaran "replaceAll" en lugar de "replaceRegex".
Urna Magic Octopus
6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));devuelve "hi world, hi life, hi you".
Thiago Mata
14
@MagicOctopusUrn: Sí, estoy de acuerdo en que fue una denominación muy pobre, que ha causado mucha confusión con el tiempo.
Jon Skeet
muy mala denominación de los métodos. ¿Por qué (sol / oráculo) complican las cosas simples?
Stunner
93

El método para agregar escapes es Pattern.quote().

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

Pero como dice Jon, puedes usar replace(). A pesar de que se desvía del replaceAllnombre, reemplaza todas las apariciones como replaceAll().

Mark Peters
fuente
Funciona perfectamente si tiene un "$" en su matchingStr por ejemplo.
Julien Lafont
más bien Pattern.compile (); Pattern.quote () trae resultados indeseables
Pavlo Zvarych
@PavloZvarych: Pattern.compile()compila la cadena como una expresión regular, lo que significa que a los caracteres especiales se les dará un significado especial. Eso es todo lo contrario de lo que Pattern.quote()hace, y lo que pedía el OP ( quote()dice, "trata la cadena como un literal"). Quizás podría ampliar los "resultados indeseables" de los que está hablando.
Mark Peters
@MarkPeters era algo así como \\ G1 \\ G por "$ 1"
Pavlo Zvarych
1
@PavloZvarych: si está tratando de citar el reemplazo (y no el patrón de búsqueda), desea usar Matcher.quoteReplacement("$aa +"). Pattern.compile()produce un Pattern, no un String, por lo que no me queda claro cómo lo estás usando en replaceAll.
Mark Peters