Contribuye

Las expresiones regulares son un elemento muy poderoso para cualquier lenguaje, sin embargo, también pueden causar un dolor de cabeza al momento de formularlas, especialmente si lo hacemos en Java.

Groovy viene a alivianar esta carga con un par de operadores  y patrones más sencillos de escribir.

  • El operador regex =~
  • El operador match ==~
  • El operador patrón ~String
  • Slashy /String/

Las expresiones regulares son definidas por patrones. Un patrón puede ser cualquier cosa desde un simple carácter, una cadena, o algo con un formato específico.

Para esto les pongo un ejemplo:

def usoDePatternDespuesMatcher(pattern, texto) {
  def matcher = texto =~ pattern // Creación del matcher
  
  println "Ha coincidido ${matcher.size()} veces"
  println "Con los elementos:"
  
  matcher.each {
    println "\t * ${it}"
  }
}

def texto = """\
  Bienvenido a GrailsMx, el lugar donde 
  hablamos del lenguaje dinámico 
  Groovy y el framework Grails, 
  esta comunidad nació el 16-09-2008
  con @domix y @neodevelop"""

  def pattern = ~"Groovy" // Coincidencia con una palabra exacta
  usoDePatternDespuesMatcher(pattern,texto)

  // Cambiemos el patrón
  pattern = /Groovy|Grails/ // Creamos un nuevo matcher con Slashy
  usoDePatternDespuesMatcher(pattern,texto)

  pattern = /\d\d-\d\d-\d\d\d\d/ // Un patrón de fechas simples
  usoDePatternDespuesMatcher(pattern,texto)

  pattern = /\w\S*/ // Todas las palabras
  usoDePatternDespuesMatcher(pattern,texto)

Aquí una lista con los símbolos que más he usado en expresiones regulares:

  • . Cualquier carácter
  • ^ Comienzo de línea
  • $ Fin de línea
  • \d Dígito
  • \D Cualquier caracter excepto dígitos
  • \s Espacios en blanco
  • \S Cualquiera menos espacios en blanco
  • \w Palabra
  • \W Cualquiera menos palabras
  • () Agrupamiento
  • (x | y) x o y
  • x* Cero o más ocurrencias de x
  • x+ Una o más ocurrencias de x
  • x? cero o una ocurrencia de x
  • x {m,n} Por lo menos ‘m’ y cuanto más ‘n’ ocurrencias de x
  • x{m} Exactamente ‘m’ ocurrencias de x
  • [a-f] Clase caracter conteniendo a,b,cd,e,f
  • [^a] Contiene cualquier caracter excepto a

Cuando conjugamos un patrón y un String podemos hacer las siguientes tareas:

  • Indicar que el patrón coincida exactamente con el texto
  • Indicar cuando hay por lo menos una ocurrencia del patrón
  • Contar las ocurrencias
  • Hacer algo con cada ocurrencia
  • Reemplazar las ocurrencias con un texto
  • Dividir el String en multiples Strings cortando cada ocurrencia

Una de las cosas que me gustan mucho con expresiones regulares en Groovy son situaciones como esta:

def jvmLanguages = ['scala','groovy','jruby','clojure','jython']
def frameworks = ['springframework','akka','play','gpars','jquery']

def pattern1 = ~/.*j.*/

assert (jvmLanguages << frameworks).flatten().grep(pattern1) == ["jruby", "clojure", "jython", "jquery"]

O bien, el clásico del correo electrónico:

def email = 'cursos@synergyj.com'
def pattern = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[A-Za-z]{2,4}/
assert email ==~ pattern

comments powered by Disqus