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.
