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 :P y ver como corrían las letras de un estado al otro, pero bueno...supongo que ese fue el lado oscuro de las Regex :D
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.
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 :P y ver como corrían las letras de un estado al otro, pero bueno...supongo que ese fue el lado oscuro de las Regex :D
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.
donde:
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-9\u002d\u002e]+)
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.