Groovy, como Java, permite el uso de expresiones regulares y lo hace de una manera sencilla. Además, añade tres operadores que facilitan aún más la labor.
Match operator (==~)
Este operador devuelve true si la expresión regular concuerda exactamente el elemento. Algunos ejemplos:
assert "abc" ==~ 'abc'
assert "abc" ==~ /abc/ assert "abcabc" ==~ /abc/ //Falla porque no es exactamente igual assert "abc" ==~ /a.c/ //Empieza con a, un caracter y c assert "abc" ==~ /.*c/ //Cualquier cosa terminada en c
Find operator (=~)
Este operador devuelve un java.util.regex.Matcher. Un matcher es un componente que aplica una expresión regular a un string. El resultado es un array de dos dimensiones. La primera dimensión contiene el match y la segunda los grupos de la coincidencia. Estos grupos se definen en las expresiones regulares por medio de paréntesis. Al aplicar una expresión a un string, se puede acceder a los grupos de forma individual, lo que puede ser interesante para acceder a porciones determinadas de un string.
Veamos un ejemplo para dejarlo un poco más claro.
def path = /C:\pruebas\grails\directorio/
def matcher = path =~ /(\w{1}):\\(\w+)\\(\w+)\\(\w+)/
println matcher[0] // ["C:\pruebas\grails\directorio", "C", "pruebas", "grails", "directorio"]
println matcher[0][1] // "C"
def path2 = matcher.replaceFirst("/etc/bin/")
println path2 // /etc/bin/
En la línea 5 podéis ver un ejemplo de cómo usar el matcher. En este caso lo que se hace es sustituir la primera concordancia con el texto introducido. Si en el string al que se le ha aplicado la expresión regular hubiera más de una concordancia, sólo se hubiera cambiado la primera de ellas por el texto indicado.
Pattern operator (~string)
Este operador transforma un string en un patrón (java.util.regex.Pattern), que no es más que una expresión regular compilada. Si se tiene intención de utilizar una expresión regular varias veces, se debería considerar el usar un patrón (por la reusabilidad y todo eso...).
def frase = "En un lugar de la Mancha, de cuyo nombre..."
def pattern = ~/\w+ar/
def matcher = pattern.matcher(frase)
def cont = matcher.getCount() // cont = 1
for (i in 0..<cont)
println matcher[i] // lugar
Bueno, si os estáis preguntando si de verdad se usan alguna vez... pues sí. Por poner un ejemplo, para la validación del formato de teléfono introducido por un usuario, el email, el código postal, etc. Así que ya sabéis, a usar expresiones regulares.
Enjoy!


0 comentarios:
Publicar un comentario