Al fin luego de tanto batallar hemos dado con la solución de este contratiempo que muchos los usuarios de nuestro espacio han tenido. Si quieres compartir algún detalle no dudes en compartir tu conocimiento.
Solución:
¿Existe algún método en Java o alguna biblioteca de código abierto para escapar (sin citar) un carácter especial (meta-carácter), para usarlo como una expresión regular?
Si está buscando una manera de crear constantes que pueda usar en sus patrones de expresiones regulares, simplemente antepóngalas con "\"
debería funcionar pero no es agradable Pattern.escape('.')
función para ayudar con esto.
Así que si estás tratando de hacer coincidir "\d"
(los string d
en lugar de un carácter decimal), entonces haría:
// this will match on d as opposed to a decimal character
String matchBackslashD = "\\d";
// as opposed to
String matchDecimalDigit = "\d";
Las 4 barras en Java string convertirse en 2 barras en el patrón de expresiones regulares. 2 barras diagonales inversas en un patrón de expresiones regulares coincide con la barra diagonal inversa. Anteponer cualquier carácter especial con una barra invertida lo convierte en un carácter normal en lugar de uno especial.
matchPeriod = "\.";
matchPlus = "\+";
matchParens = "\(\)";
...
En tu publicación usas el Pattern.quote(string)
método. Este método envuelve su patrón entre "\Q"
y "\E"
para que puedas hacer coincidir un string incluso si tiene un carácter de expresión regular especial (+
, .
, \d
etc)
Escribí este patrón:
Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[()\[\].+*?^$\\|]");
Y úsalo en este método:
String escapeSpecialRegexChars(String str)
return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\$0");
Entonces puedes usarlo así, por ejemplo:
Pattern toSafePattern(String text)
return Pattern.compile(".*" + escapeSpecialRegexChars(text) + ".*");
Necesitábamos hacer eso porque, después de escapar, agregamos algunas expresiones regulares. Si no, simplemente puede usar Q
y E
:
Pattern toSafePattern(String text)
return Pattern.compile(".*\Q" + text + "\E.*")
La única forma en que el comparador de expresiones regulares sabe que está buscando un dígito y no la letra d
es escapar de la letra (d
). Para escribir el carácter de escape de expresiones regulares en Java, debe escaparlo (por lo que se convierte
\
). Por lo tanto, no hay forma de evitar escribir barras invertidas dobles para caracteres especiales de expresiones regulares.
Puntuaciones y reseñas
Recuerda que tienes la capacidad de aclarar tu experiencia si diste con la solución.