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?


posible duplicado del problema
— McDowell

Respuestas:


189

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


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().


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.