Escapar símbolos especiales en una expresión regular en Java

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

Las expresiones regulares son cadenas formados por una serie de caracteres y combinación de ellos que se interpretan de forma especial. Las expresiones regulares permiten expresar mediante un patrón ocurrencias en una cadena, permiten encontrar coincidencias y validar que una cadena cumple el patrón de la expresión regular. El patrón de las expresiones regulares .

Así el caracter ^ en una expresión regular indica el inicio de la cadena, $ el final, el . cualquier caracter, un grupo seguido + una o más ocurrencias y un grupo seguido de * cero o más ocurrencias. Hay muchos otros caracteres especiales que puede contener una expresión regular.

En el caso de incluir alguno de los caracteres especiales en una expresión regular estos son interpretados de forma especial, para que un caracter especial o grupo de caracteres no sea interpretado sino tratado como un literal este debe ser escapado. Para escapar una palabra en una expresión regular en Java basta con utilizar el método Pattern.quote().

La expresión regular (^1+$) cumple con todas las cadenas que estén formadas con al menos un caracter del número 1. En caso de querer buscar las cadenas que contengan el grupo de caracteres (^1+$) que empiecen por a y acaben por b el código sería el siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
    	String string = "aaa(1+)bbb";
    	String regexpQuoted = String.format("a+%sb+", Pattern.quote("(1+)"));
        System.out.printf("Quoted (regexp: \"%s\", string: \"%s\"): %s%n", regexpQuoted, string, Pattern.matches(regexpQuoted, string));
    }
}
Main-1.java

En la cadena de la expresión regular se observa que el método quote ha insertado varios caracteres antes y después de la cadena escapada (1+).

1
2
Quoted (regexp: "a+\Q(1+)\Eb+", string: "aaa(1+)bbb"): true

System.out-1

En caso de no escapar el grupo de caracteres (^1+$) no se encontraría la coincidencia porque los caracteres ( ) especiales de grupo y el + son interpretados por la expresión regular.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
    	String string = "aaa(1+)bbb";
    	String regexpUnquoted = "a+(1+)b+";
        System.out.printf("Unquoted (regexp: \"%s\", string: \"%s\"): %s%n", regexpUnquoted, string, Pattern.matches(regexpUnquoted, string));
    }
}
Main-2.java
1
2
Unquoted (regexp: "a+(1+)b+", string: "aaa(1+)bbb"): false

System.out-2

Escapar una palabra es importante si con ella se construye una expresión regular y esta proviene de un campo de entrada del usuario o de otro sistema. No hacerlo posibilita una forma de inyectar en la expresión regular un patrón que sea interpretado y podría ser un problema de seguridad.

El ejemplo se puede probar con una de las novedades introducidas en Java 11 para ejecutar un programa desde el código fuente sin requerir compilación.


Comparte el artículo: