¿Hay algún método en Java o en cualquier biblioteca de código abierto para escaparse (sin citar) un carácter especial (metacaracteres), para usarlo como una expresión regular?Escapar caracteres especiales en Java Expresiones regulares
Esto sería muy útil en la construcción dinámica de una expresión regular, sin tener que escanear manualmente cada carácter individual.
Por ejemplo, considere una expresión regular simple como \d+\.\d+
que coincide con los números con un punto decimal como 1.2
, así como el código siguiente:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
No es sorprendente que la salida producida por el código anterior es:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
es decir, regex1
partidos 1.2
pero regex2
(que es "dinámica" construido) no (en lugar, que coincide con la cadena literal d+.d+
).
Entonces, ¿hay algún método que escape automáticamente a cada metacaracidad de expresiones regulares?
Si lo hubiera, digamos, un escape()
método estático en java.util.regex.Pattern
, la salida de
Pattern.escape('.')
sería la cadena "\."
, pero
Pattern.escape(',')
sólo debe producir ","
, ya que es no es un meta-personaje Del mismo modo,
Pattern.escape('d')
podría producir "\d"
, ya 'd'
se utiliza para denotar dígitos (aunque escape puede no tener sentido en este caso, como 'd'
podría significar literal 'd'
, que no sería mal entendido por el interpeter expresión regular para ser algo más, como sería el caso con '.'
).
¿Cómo sería un método tal de determinar la diferencia beween un 'd' significaba como metacarácter y una 'd' en el texto para que coincida? ('quote (" d + Dollars? ")' se convertiría en '" \\ d + \\ Dollar \\ s? "' en un método de cotización trivial.) – rsp
Correcto, que es exactamente por lo que estoy pidiendo un método que escaparía personajes individuales! :-) – PNS
Para escapar solo de los caracteres individuales que podría jugar con un límite de palabras, algo como: 's/\ b ([dswDSW]) \ b/\\ $ 1/g;' – rsp