Expresiones Regulares en .Net

Intentando desarrollar un parser, ya que veremos que parseamos🙂 es imposible no caer en este tema de expresiones regulares, a menos de que nos fabriquemos una rutina que caracter a caracter vaya leyendo, almacenando en un buffer y comprobando si es lo que estamos buscando, podría ser una opción si es algo sencillo, pero…hgggssss.

O podemos ser los programadores duros y construirnos nuestra propia maquina de estados y con ella procesar las expresiones.Para los que no saben, o alguno que haya cursado conmigo Sintaxis y Semantica del Lenguaje y no se acuerda de los que nos hablaba el profe Bernal cuando nos hacía hacer la máquina de estados de una expresión regular dada, como aabbcc😛 y ver como corrían las letras de un estado al otro, pero bueno…supongo que ese fue el lado oscuro de las Regex😀
Una definición semi-formal: Una expresión regular es una cadena que describe o “matchea” a un conjunto de cadenas, dado un conjunto de reglas de sintaxis. En sintesis, es una cadena que representa a un patron que se busca en un texto. Un ejemplo más palpable, que por cierto los usamos a menudo, cuando queremos copiar archivos a un directorio: #cp *.cs /home/dario. Estamos aplicando el concepto. Esto en castellano seria como copiar todos los archivos (*) que tengan la extensión ‘cs’ a el directorio /home/dario. Es simple.

 

Las expresiones regulares funcionan de una manera similar. Tienen un conjunto finito de simbolos para la representación de caracteres, numeros, y como tambien simbolos para indicar cardinalidad.

Vayamos a un ejemplo: todos sabemos que una dirección IP se asemeja a: 10.66.43.141. Es decir, [numero 1-3 digitos][punto][numero 1-3 digitos][punto][numero 1-3 digitos][punto][numero 1-3 digitos]

Que mejor ejemplo para aplicar expresiones regulares. Aunque las diferencias se den, dependiendo del lenguaje que estamos trabajando, las expresiones regulares no varían mucho de una implementación a la otra. Por lo general todas las implementaciones se parecen bastante a la manera que lo hace Perl, cuyo motor de expresiones regulares es muy potente, mejor dicho, cuando te nombran Perl, lo primero que se me viene a la cabeza es RegEx, que ha tenido su inspiración en sed.Si programás en .Net y querés usar RegExs, The Regulator es ideal para armar las cadenas, probarlas y ver si funcionan como queremos, esta herramienta está hecha en .Net (dicho sea de paso).

Ejemplo: si queremos evaluar una expresión matemática para extraer sus operadores y operandos, y despues convertirla a postfija para su evaluación, primero debemos masajearla un poco.

Entonces, si tenemos una expresion como:

2.34m+344/444*(variable.value+33.55m+2^234)/2

La podríamos evaluar con la siguiente expresión regular, que usa el concepto de grupos, pero no es dificil de entender:

(?(?[d]+)u002e(?[d]+)m)|
(?d+)|
(?u0028|u0029|u002a|u002b|u002d|u002f|u005e)|
u0022(?.+)u0022|
(?[a-zA-Z0-9u002du002e]+)

donde:

  • \d –> representa un decimal.
  • [ ] –> uno, cualquiera de los caracteres dentro de los corchetes.
  • (? ) –> se utiliza para hacer grupos.
  • \u00xx –> representa un caracter unicode.
  • . –> cualquier caracter, excepto el retorno de carro.
  • | –> exclusión.
  • a-z –> cualquier caracter entre a y z.



No comments yet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: