online - regex java 8
Barra inclinada hacia adelante en Java Regex (3)
No puedo entender por qué el siguiente código no se comporta como se esperaba
"Hello/You/There".replaceAll("/", "///");
- Salida esperada:
Hello//You//There
- Salida real:
Hello/You/There
¿Necesito escapar barras oblicuas? No lo creía, pero también intenté lo siguiente en contra de mi voluntad ... no funcionó
"Hello/You/There".replaceAll("///", "///");
Al final me di cuenta de que no necesito una expresión regular y puedo usar lo siguiente, que no crea una expresión regular
"Hello/You/There".replace("/", "///");
Sin embargo, aún me gustaría entender por qué mi primer ejemplo no funciona.
El problema es que necesita duplicar las barras diagonales inversas en la cadena de reemplazo. Verás, "///"
(como estoy seguro que sabes) significa que la cadena de reemplazo es //
, y (como probablemente no sepas) la cadena de reemplazo //
realidad solo inserta /
, porque Java es raro, y le da un significado especial en la cadena de reemplazo. (Supuestamente es así que /$
será un signo de dólar literal, pero creo que la verdadera razón es que querían meterse con la gente. Otros idiomas no lo hacen de esta manera). Así que tienes que escribir:
"Hello/You/There".replaceAll("/", "/////");
o:
"Hello/You/There".replaceAll("/", Matcher.quoteReplacement("///"));
En realidad, hay una razón detrás de por qué todos estos están en mal estado. Un poco más de profundización se hace en este hilo y podría ser útil para entender la razón por la cual "//" se comporta así.
Se requiere un doble escape cuando se presenta como una cadena.
Cada vez que hago una nueva expresión regular hago un montón de pruebas con herramientas en línea, por ejemplo: http://www.regexplanet.com/advanced/java/index.html
Ese sitio web le permite ingresar la expresión regular, que se escapará en una cadena para usted, y luego puede probarla con diferentes entradas.