Archive for the ‘regex’ Category

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.



Anuncios