Expresiones regulares

Groovy tiene soporte nativo para expresiones regulares, con una sintaxis muy simple de usar.

Una nueva forma de definir strings

Primero un detalle importante que todavía no vimos. En Groovy hay dos formas de delimitar un String. La común es con el uso de comillas ("), pero también puede usarse la barra de dividir (/). Por ejemplo:

"invasor" == /invasor/ 

La ventaja es que al usar barras no es necesario escapar las contrabarras y otros caracteres "raros". Esto simplifica mucho la escritura de expresiones regulares.

Creando expresiones regulares

Las expresiones regulares son muy versátiles para el procesamiento de textos. Brindan la posibilidad de buscar y extraer patrones (pattenrs) de un string. El ejemplo más simple de una expresión regular es una string con letras y números. Y la expresión más simple con una expresión regular es con el operador ==~

Por ejemplo, la siguiente expresión se evalúa en verdadero:

"perro" ==~ /perro/

El operador ==~ es equivalente al operador ==, pero trata de igualar patrones. La expresión regular está encerrada entre barras /. Esto le dice a Groovy que se trata de una expresión regular, y no es un simple String.

Pero las expresiones regulares pueden hacer mucho más. Por ejemplo, supongamos que nos interese tanto la palabra "perro" como "perros". Una expresión regular que nos sirve sería:

"perro" ==~ /perros?/ "perros" ==~ /perros?/

Ambas expresiones evaluán a verdadero. El caracterer "?" indica que la letra anterior es opcional.

Obviamente podemos construir cosas más complejas:

"invasor" ==~ /invasor(es)?/

En este caso, usamos los paréntesis para agrupar una expresión. Así, el texto "es" es opcional.

Los operadores de Groovy

Vamos a aclarar conceptos entonces. Groovy tiene tres operadores para expresiones regulares:

  • ~ es el símbolo de patrón
  • =~ significa "buscar", es decir, busca una ocurrencia del patrón en el string
  • ==~ significa "igualar", es decir, devuelve verdadero si el String y el patrón concuerdan perfectamente.

Por ejemplo:

//esto es verdadero "El invasor Zim es del Imperio Irken" =~ /invasor/

Esa expresión se evalúa en verdadero. Sin embargo:

//esto es falso! "El invasor Zim es del Imperio Irken" ==~ /invasor/

El objeto matcher

También es posible evaluar expresiones regulares de manera programática, definiendo un patrón, creando el matcher y aplicándolo.

def pattern = ~/groovy/ def matcher = pattern.matcher('mi groovy amigo') assert matcher.find() assert matcher.matches() == false 

El método matcher.find() es equivalente al operador =~ y el método matcher.matches() es equivalente a ==~

Más sobre expresiones regulares

Se pueden construir expresiones regulares mucho más complejas, que escapan a este tutorial. Hay muchas guías en internet para aprender más sobre las expresiones regulares.