teclado reves poner laptop invertida inclinada hacia hacer escribir derecha como barra java escaping backslash replaceall

java - reves - String.replaceTodas las barras diagonales inversas con doble barra invertida



diagonal invertida en laptop (5)

Para evitar este tipo de problemas, puede usar replace (que toma una cadena simple) en lugar de replaceAll (que toma una expresión regular). Aún necesitará escapar de las barras diagonales inversas, pero no de la manera salvaje que se requiere con las expresiones regulares.

Estoy tratando de convertir el String /something/ en el String //something// usando replaceAll , pero sigo recibiendo todo tipo de errores. Pensé que esta era la solución:

theString.replaceAll("//", "////");

Pero esto da la siguiente excepción:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1


Sí ... en el momento en que el compilador de expresiones regulares ve el patrón que le ha dado, solo ve una barra invertida (ya que el analizador de Java ha convertido el backwhack doble en uno solo). ¡ "////" reemplazar "////" por "////" , "////" o no! Java realmente necesita una buena sintaxis de cadena sin formato.


Tendrá que escapar de la barra invertida (escapada) en el primer argumento, ya que es una expresión regular. El reemplazo (segundo argumento - vea Matcher#replaceAll(String) ) también tiene su significado especial de barras diagonales inversas, por lo que deberá reemplazarlas por:

theString.replaceAll("////", "////////");


The String#replaceAll() interpreta el argumento como una expresión regular . El / es un carácter de escape tanto en String como en regex . Necesitas escaparte dos veces para regex:

string.replaceAll("////", "////////");

Pero no necesariamente necesita expresiones regulares para esto, simplemente porque quiere un reemplazo exacto de carácter por carácter y no necesita patrones aquí. Entonces String#replace() debería ser suficiente:

string.replace("//", "////");

Actualización : según los comentarios, parece que desea utilizar la cadena en el contexto de JavaScript. Quizá sería mejor utilizar StringEscapeUtils#escapeEcmaScript() para cubrir más caracteres.


replaceAll(target, replacement) utiliza la sintaxis de expresión regular (regex) para el target y parcialmente para el replacement .

El problema es que / es un carácter especial en regex (como /d para representa el dígito) y en String literal (como /n para crear un separador de línea o /" para representar un símbolo de doble cita), y para crear / symbol necesitamos escaparlo con adicional / antes en ambos niveles.

Entonces, para crear una expresión regenea target que represente / símbolo, debemos escapar dos veces:

  • en regex //
  • Cadena literal "////" (cada uno necesita su propio / extra).

En caso de replacement también es especial para escapar de otro personaje especial que es $ . A través $x notación $x , se puede acceder a la porción de datos que coinciden con regex y reutilizarlos en reemplazo, como replaceAll("(/d)", "$1$1") duplicará cada dígito.

Así que, de nuevo, para tener single / en replacement necesitamos texto que represente dos barras diagonales inversas:

  • //
  • pero la cadena literal que representa // parece "////"

PERO dado que queremos poner dos / en reemplazo, necesitamos "////////" allí (dos "////" ).

replaceAll("////", "////////");

Para hacer la vida más fácil, Java proporciona herramientas para escanear texto automáticamente en el target y las piezas de replacement . Entonces ahora podemos enfocarnos únicamente en cadenas y olvidarnos de la sintaxis de expresiones regulares:

replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))

que en nuestro caso puede parecerse

replaceAll(Pattern.quote("//"), Matcher.quoteReplacement("////"))

O incluso más simple si no queremos usar regex no implica replaceAll y en su lugar permite usar replace (ambos métodos reemplazarán todos los target , pero el segundo no implica la sintaxis de regex). Entonces simplemente podrías escribir

theString = theString.replace("//", "////")