unescape special characters java regex string replaceall

unescape - replace html special characters javascript



String replaceAll("¾") en java (7)

El primer parámetro de replaceAll() es un REGEX, y ''.'' Significa cualquier personaje en el área REGEX.

Tengo un error realmente extraño en mi código Java y no puedo averiguar qué es lo que está mal.

Digamos que tengo este código:

private void test() { String test1 = replace("1.25"); String test2 = replace("1.5"); String test3 = replace("1.75"); } private String replace(String s) { s = s.replaceAll(".25", "¼"); s = s.replaceAll(".5", "½"); s = s.replaceAll(".75", "¾"); return s; }

Entonces el resultado será:

prueba1 = "¼"

test2 = "½"

test3 = "½" ??????????

¿Puede alguien explicar por qué test3 se convierte en "½"?


El problema es que en una expresión regular . Significa cualquier personaje. replaceAll toma una expresión regular como parámetro, por lo que debe usar otros medios, como replace .


Estás utilizando replaceAll() , que toma una expresión regular. En regex-land,. significa "cualquier personaje". Use replace() lugar, que funciona con cadenas literales.


La función reemplazar todo interpreta el primer argumento como una expresión regular. ".5" como expresión regular coincidirá con cualquier cosa seguida de un 5, como la prueba de cadena2. Escapar del ''.'' personaje con una barra invertida:

s = s.replaceAll("//.25", "¼");


Porque replaceAll toma una expresión regular. Eso significa . se interpreta como un comodín que también coincide con 7 modo que .5 coincide con 75 . Puede escapar en expresiones regulares usando / pero tenga en cuenta que esto también es una Cadena, lo que significa que tendrá que escapar dos veces: entonces replaceAll("//.5", "½") hará lo que desea.


Use String.replace() lugar de String.replaceAll()

Hazlo así

private String replace(String s) { s = s.replace(".25", "¼"); s = s.replace(".5", "½"); s = s.replace(".75", "¾"); return s; }


replaceAll usa regex como primer parámetro que se debe encontrar y punto . en regex es metacharacter que coincidirá con todos los caracteres excepto la nueva línea. Así que cuando estás usando

s = s.replaceAll(".5", "½");

en "1.75" .5 puede coincidir con 75 (ya que coincide con todos). Así que después de tal cambio

1.75 -- will become 1.½

(Note que 1.25 funciona correctamente solo porque usó .25 antes de .5 )

Para evitar este tipo de comportamiento es necesario escapar de punto. Puedes hacerlo por

  • colocando / delante de él (recuerda que para crear / literal necesitas escribirlo como "//" ) "//." ,
  • colocarlo en la clase de caracteres [.] ,
  • rodéelo con /Q y /E que representan el inicio y el final de la cita //Q.//E
  • El entorno con /Q y /E también se puede hacer con Pattern.quote(".")
  • En el caso de la instancia de Patrón mientras compila, puede agregar el indicador de Pattern.LITERAL para hacer todos los metacaracteres utilizados en patrones literales.

Si desea que todo nuestro patrón sea un literal simple, puede usar replace lugar de replace replaceAll lo que automáticamente usará el indicador de Pattern.LITERAL y cambiará todos los metacaracteres de Pattern.LITERAL regulares en literales simples.

Así que puedes probar algo como

return s.replaceAll("//.25", "¼").replaceAll("//.5", "½").replaceAll("//.75", "¾");

o más simple

return s.replace(".25", "¼").replace(".5", "½").replace(".75", "¾");