JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Generación automática de DLLs para expresiones regulares

Las expresiones regulares son una de las herramientas más útiles con las que contamos los programadores a la hora de analizar cadenas de texto, esto es, contenidos de archivos, expresiones y comandos, etc... Por analizar me refiero no sólo a buscar partes de textos sino a extraerlas, transformarlas, y muchas otras tareas. Se trata de un elemento que desde mi punto de vista todo programador que se precie debiera conocer.

Las expresioes regulares pueden llegar a ser muy complejas. Cuando se establece una expresión regular se genera en memoria código especializado que implementa el análisis indicado por éstas. Debido a ello cada vez que se declara una se debe generar dicho código, lo cual puede ser más o menos costoso en función de la complejidad de la expresión regular.

Para expresiones sencillas no tendremos demasiado problema. Con expresiones muy complejas que usemos mucha veces (muy a menudo) dentro de una aplicación esta compilación previa ya puede ser más significativa.

Para mejorar el rendimiento al máximo al usar expresiones regulares, la plataforma .NET (esa joya de la técnica) proporciona una forma de compilar la expresión regular a disco, dentro de un ensamblado, y de ese modo disponer de ella pre-compilada y lista para usar en cualquir momento con el máximo rendimiento. Para ello el objeto RegEx proporciona el método CompileToAsembly. La forma de usarlo es relativamente sencilla:

RegexCompilationInfo rec = new RegexCompilationInfo(miExpresionRegular,  RegexOptions.IgnoreCase | RegexOptions.Multiline,
  "miRegex", "MiespacioDeNombres", true);
 RegexCompilationInfo[] col = {rec};
 System.Reflection.AssemblyName a = new System.Reflection.AssemblyName();
 a.Name = "MiBiblioteca.Regex";
 Regex.CompileToAssembly(col, a);

Lo que hace el fragmento anterior es declarar el modo en que se compilará la expresión regular, creando para ello un objeto de tpo RegexCompilationInfo al que se le pasan la expresión a compilar, las opciones para ésta, el nombre de la clase ('miRegex' en este caso), el espacio de nombres bajo el que estará agrupada y un booleano que indica si la clase será pública o no. Se define luego el ensamblado que se va a crear, en este caso sólo le otorgamos un nombre. Por fin se llama al método CompileToAssembly que se encarga de generar el resultado.

El resultado en cuestión será una DLL con el nombre indicado (en nuestro caso 'MiBiblioteca.Regex.dll') que contiene una clase llamada 'miRegex' dentro del espacio de nombres especificado. Fíjese en que podríamos haber compilado dentro de este mismo ensamblado tantas expresiones regulares como hubiésemos deseado ya que el primer argumento del método es una colección de objetos RegexCompilationInfo.

La clase generada deriva de Regex, por lo que usarla es muy fácil. Se agrega una referencia al nuevo ensamblado desde nuestra aplicación. Se instancia la nueva clase y se usa como si hubiésemos instanciado una clase RegEx, por ejemplo:

MiespacioDeNombres.MiRegex miregex = new MiespacioDeNombres.MiRegex();
MessageBox.Show(miregex.Ismatch("una cadena a analizar").ToString());

La verdad es que es muy interesante y nunca he visto esta característica referenciada en ningún sitio hasta ahora (salvo en la propia documentación de MSDN).

Espero que lo encuentres útil.

José Manuel Alarcón
Banner

Agregar comentario