util pattern online matches java regex pattern-matching

pattern - regex java online



¿Cuál es el uso del método Pattern.quote? (5)

El método Pattern.quote cita parte de un patrón regex para hacer que regex lo interprete como literales de cadena.

Digamos que tiene alguna entrada de usuario en su programa de búsqueda, y quiere regex para ello. Pero esta entrada puede tener caracteres inseguros para que pueda usar

Pattern pattern = Pattern.compile(Pattern.quote(userInput));

Este método no cita un Pattern pero, como usted señala, ajusta una String en comillas de expresiones regulares.

Estoy tratando de entender Pattern.quote usando el siguiente código:

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545"); System.out.println("Pattern is : "+pattern);

produce la salida:

Pattern is : /Q1252343% 8 567 hdfg gf^$545/E

¿Qué son /Q y /E aquí? La descripción de la documentación dice:

Devuelve una String patrón literal para la String especificada.

Este método produce una String que se puede usar para crear un Pattern que coincida con la cadena como si fuera un patrón literal.

Los metacaracteres o secuencias de escape en la secuencia de entrada no tendrán un significado especial.

Pero el tipo de devolución de Pattern.quote es String y no es un objeto de Pattern compilado.

¿Por qué se requiere este método y cuáles son algunos ejemplos de uso?


Regex colisiona frecuentemente con cadenas normales. Digamos que quiero una expresión regular para buscar una determinada cadena que solo se conoce en tiempo de ejecución. ¿Cómo podemos estar seguros de que la cadena no tiene expresiones regulares, por ejemplo, ( ".*.*.*" )? Lo citamos


Si compila la cadena devuelta por Pattern.quote , obtendrá un Pattern que coincida con la cadena literal que quote d.

/Q y /E marcan el comienzo y el final de la parte citada de la cadena.


/Q significa "inicio de texto literal" (es decir, regex "cita abierta")
/E significa "fin del texto literal" (es decir, regex "cita cercana")

Llamar al método Pattern.quote() envuelve la cadena en /Q.../E , que convierte el texto en un literal de expresión regular. Por ejemplo, Pattern.quote(".*") con un punto y luego con un asterisco:

System.out.println("foo".matches(".*")); // true System.out.println("foo".matches(Pattern.quote(".*"))); // false System.out.println(".*".matches(Pattern.quote(".*"))); // true

El propósito del método es no requerir que el programador tenga que recordar los términos especiales /Q y /E y agregar un poco de legibilidad al código - la expresión regular ya es bastante difícil de leer. Comparar:

someString.matches(Pattern.quote(someLiteral)); someString.matches("//Q" + someLiteral + "//E"));

En referencia al javadoc :

Devuelve una cadena de patrón literal para la cadena especificada.

Este método produce una cadena que se puede usar para crear un patrón que coincida con la cadena como si fuera un patrón literal.

Los metacaracteres o secuencias de escape en la secuencia de entrada no tendrán un significado especial.


/Q y /E , entre todos los demás, están completamente documentados en la página java.util.regex.Pattern Javadoc. Significan "comenzar Q uote", " E nd quote" y demarcar una región donde todos los caracteres tienen el significado literal. La forma de utilizar el retorno de Pattern.quote es alimentarlo a Pattern.compile , o cualquier otro método que acepte una cadena de patrón, como String.split .