sábado, 24 de mayo de 2014

Expresiones Regulares .NET

Potencia de las expresiones Regulares en .NET

Por cuestiones de trabajo últimamente he tenido que utilizar muchas expresiones regulares en .NET, ya las había utilizado en alguna que otra ocasión en otras tecnologías, pero he profundizado mucho más en su potencia.

Las expresiones regulares nos ayudan en gran medida a la hora de parsear un texto a nuestro gusto. Prácticamente todos los lenguajes de alto nivel tienen funciones de cadena como IndexOf (.NET, Java) o stros (PHP) que permiten sacar la posición de una subcadena dentro de una cadena, por ejemplo:

Dim str As String = "La revolución informática"
System.Console.Writeline(str.IndexOf("revolución"))

Mostrará por la consola un 2, que indica la posición de la subcadena "revolución".

Estas sencillas funciones nos permiten realizar un análisis de una cadena simple, pero cuando la cadena se complica un poco, el código se ensucia demasiado. Por ejemplo, tenemos la siguiente cadena generada a partir de un objeto:

Mi nombre es [Iñigo Montoya] mido [1.80] tengo los ojos [azules] [Tu mataste a mi padre, prepárate a morir]

En negrita y azul están marcados los campos variables de la cadena.

Utilizando funciones como indexOf y substring, podríamos obtener los datos y parsearlos. Para obtener el nombre sacaríamos la posición de la subcadena "Nombre", después la posición de la cadena "altura", restaríamos las posiciones, compensaríamos el tamaño de la cadena "Nombre" y haríamos la resta.

Sencillo sí, pero terriblemente tedioso. Para una cadena relativamente sencilla, necesitaríamos un código muy engorroso. Aquí entran en juego las expresiones regulares.

Vamos a resolver la cadena anterior utilizando la clase Regex de .NET


  1. Dim str As String = "Mi nombre es Iñigo Montoya mido 1.80 tengo los ojos azules. Tu mataste a mi padre, prepárate a morir"  
  2. Dim regex As New Regex("Mi nombre es (?<nombre>[\w\s]+) mido (?<altura>[\d].[\d]+) tengo los ojos (?<color>[\w\s]+). (?<cita>[\w\s]+)")  
  3.   
  4. If (regex.IsMatch(str)) Then  
  5.     Dim grupos As GroupCollection = regex.Match(str).Groups  
  6.   
  7.     Dim nombre As String = grupos.Item("nombre").Value  
  8.     Dim altura As String = grupos.Item("altura").Value  
  9.     Dim ojos As String = grupos.Item("color").Value  
  10.     Dim cita As String = grupos.Item("cita").Value  
  11.   
  12.     System.Console.WriteLine("Nombre: " + nombre)  
  13.     System.Console.WriteLine("Altura: " + altura)  
  14.     System.Console.WriteLine("Color de ojos: " + ojos)  
  15.     System.Console.WriteLine("Cita favorita: " + cita)  
  16. End If  
  1. <nombre><altura><color><cita>  
  2. </cita></color></altura></nombre>  
Como resultado obtendríamos:
   
Nombre: Iñigo Montoya
Altura: 1.80
Color de ojos: azules
Cita favorita: Tu mataste a mi padre

Como vemos, el código es muy sencillo. Lo hacemos todo con una única linea: regex.Match(str).Groups. En este ejemplo he utilizado las agrupaciones de las expresiones regulares. Estás se definene como (?[Expresion regular]) al tener nombre nos permiten acceder directamente a valor de la expresión regular que deseamos, en el ejemplo anterior: nombre, altura, color de ojos y cita favorita.

Esto es solo una breve introducción de todo lo que se puede hacer con expresiones regulares pero creo que deja de manifiesto la potencia de estas. Creo que ampliaré la información de las expresiones regulares en futuros artículos, mientras tanto quizás te interesen estas páginas:

http://www.regular-expressions.info/
http://msdn.microsoft.com/es-es/library/system.text.regularexpressions.regex(v=vs.80).aspx

No hay comentarios.:

Publicar un comentario