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.

2 Responses to “Expresiones Regulares en .Net”
RSS feed for comments on this post. TrackBack URL
Interesante artículo. Quisiera que me ayudara en un pequeño problema. Estoy construyendo un sistema donde el usuario puede definir varibles, y despúes una expresión matemática donde se combinen los valores de dichas variables. La verdad no tengo idea de como hacerlo, no me queda claro si crear una expresión para cada formula que cree el usuario y luego evaluar dicha expresión con los valores de las variables. Si usted ha hecho algo parecido, o tiene idea de como puediera implementarse le agradecería me lo comentara.
De antemano gracias.
Brayan
Comment by Brayan Alonso — 3 March 2008 @ 13:46
Hola,
Te referís a una función parecida a esta que despues hay que evaluar?
f(x) = x^2 + 1
Si es algo así, dale una mirada a esto:
http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx
Saludos
Comment by Dario Quintana — 3 March 2008 @ 18:09