<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Introducción a las Expresiones Regulares.</title><link>http://geeks.ms/wikis/arquitecturasoftware/introducci-243-n-a-las-expresiones-regulares.aspx</link><description>Wiki sobre Arquitectura del software</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Introducción a las Expresiones Regulares.</title><link>http://geeks.ms/wikis/arquitecturasoftware/introducci-243-n-a-las-expresiones-regulares.aspx</link><pubDate>Mon, 13 Sep 2010 09:28:03 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:23</guid><dc:creator>Josué Yeray Julián Ferreiro</dc:creator><comments>http://geeks.ms/wikis/arquitecturasoftware/introducci-243-n-a-las-expresiones-regulares/comments.aspx</comments><description>Revisión actual enviado a Wiki sobre Arquitectura del software en Geeks•ms por Josué Yeray Julián Ferreiro a 9/13/2010 11:28:03 AM&lt;br /&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Hola a todos&lt;/p&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Las expresiones regulares acompa&amp;ntilde;an a los programadores desde hace mucho tiempo, se comenz&amp;oacute; a hablar de ellas en Teor&amp;iacute;a de la informaci&amp;oacute;n desde el a&amp;ntilde;o 1950, y desde entonces han supuesto una potente forma de procesar textos basada en patrones de b&amp;uacute;squeda.&lt;/p&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;p&gt;A&amp;uacute;n as&amp;iacute; muchas veces es una parte del desarrollo que pasa desapercibida por lo que he decidido dedicarle algo de tiempo y explicaros sus or&amp;iacute;genes, historia, implementaciones y gran funcionalidad, estoy seguro que os podr&amp;aacute;n sacar de m&amp;aacute;s de un aprieto.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h4 align="justify"&gt;Pero&amp;hellip; &amp;iquest;Que son las Expresiones regulares?&lt;/h4&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Una expresi&amp;oacute;n regular, tambi&amp;eacute;n llamada patr&amp;oacute;n, es una expresi&amp;oacute;n que define de manera gen&amp;eacute;rica un conjunto de cadenas, de las que conocemos su estructura b&amp;aacute;sica pero no conocemos cada uno de los caracteres que pueden componerlas. &lt;/p&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Por poner un ejemplo, pensemos en una lista de elementos:&lt;strong&gt; Casa, Caza, Caasa&lt;/strong&gt;, podr&amp;iacute;amos describir todos estos elementos con la expresi&amp;oacute;n regular o patr&amp;oacute;n [&lt;strong&gt; Ca(a?|s|z)a&lt;/strong&gt; ], que identificar&amp;iacute;a las 3 cadenas antes indicadas, m&amp;aacute;s adelante analizaremos m&amp;aacute;s a fondo este patr&amp;oacute;n para que comprend&amp;aacute;is su significado.&lt;/p&gt;
&lt;/div&gt;
&lt;h4&gt;Historia&lt;/h4&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Los or&amp;iacute;genes de las expresiones regulares se encuentran en la teor&amp;iacute;a de aut&amp;oacute;matas y la teor&amp;iacute;a de lenguajes formales, en 1950 el matem&amp;aacute;tico &lt;a target="_blank" rel="nofollow" href="http://en.wikipedia.org/wiki/Stephen_Cole_Kleene"&gt;Stephen Cole Kleene&lt;/a&gt; describi&amp;oacute; estos modelos usando su notaci&amp;oacute;n matem&amp;aacute;tica llamada Regular Sets, y adaptados posteriormente al editor ed de UNIX, para m&amp;aacute;s tarde ser usadas en expr, AWK, Emacs, vi y lex.&lt;/p&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;p&gt;El uso de expresiones regulares en modelado de datos e informaci&amp;oacute;n estructurada comenz&amp;oacute; en 1960 y se expandi&amp;oacute; considerablemente en 1980. El n&amp;uacute;cleo del standard &lt;a target="_blank" rel="nofollow" href="http://en.wikipedia.org/wiki/XML_schema"&gt;Lenguaje de especificaciones estructuradas&lt;/a&gt; son las expresiones regulares.&lt;/p&gt;
&lt;/div&gt;
&lt;h4&gt;Expresiones Regulares en .NET&lt;/h4&gt;
&lt;div align="justify"&gt;
&lt;p&gt;.NET incluye un motor de expresiones regulares desde su primera versi&amp;oacute;n, que no ha sufrido cambios importantes y es uno de los mejor implementados que podemos encontrar.&lt;/p&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;p&gt;Para usar expresiones regulares en nuestra aplicaci&amp;oacute;n simplemente debemos importar el namespace System.Text.RegularExpressions al inicio de nuestra clase:&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;pre class="brush: vb;"&gt;Imports System.Text.RegularExpressions

Class MainWindow

End Class&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Una vez hecho esto podremos acceder a la clase RegEx, que representa una instancia del motor de expresiones regulares de .NET, podemos usar esta clase para buscar r&amp;aacute;pidamente una subcadena dentro de una gran cantidad de texto o para extraer, editar, reemplazar o eliminar subcadenas de texto.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para ello, primero debemos definir el patr&amp;oacute;n o expresi&amp;oacute;n que queremos buscar. Para esto las expresiones regulares cuentan con todo un ejercito de definiciones que nos ayudan a indicar el texto que queremos considerar una coincidencia:&lt;/p&gt;
&lt;table cellpadding="2" cellspacing="1" border="1" style="width:563px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;Definici&amp;oacute;n&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Descripci&amp;oacute;n&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;|&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;&amp;oacute;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;^&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Inicio de la l&amp;iacute;nea.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;$&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Fin de la l&amp;iacute;nea.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;\A&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Inicio de la cadena.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;\Z&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Fin de la cadena.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;\b&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Inicio / Fin de palabra.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;\B&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;No al inicio o fin de palabra.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;*&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar el d&amp;iacute;gito o letra anterior 0 &amp;oacute; m&amp;aacute;s veces.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;?&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar el d&amp;iacute;gito o letra anterior 0 &amp;oacute; 1 vez.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar el d&amp;iacute;gito o letra anterior al menos 1 vez.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;{n}&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar exactamente el contenido de las llaves.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;{n,m}&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar todas las coincidencias entre n y m.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;{n,}&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar desde n en adelante.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;\u0000 - \uFFFF&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Buscar el caracter unicode.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;?&amp;amp;lt;nombre&amp;amp;gt;Expr.Regular&lt;/p&gt;
&lt;/td&gt;
&lt;td width="358" valign="top"&gt;
&lt;p&gt;Asignar un nombre al grupo de captura.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Esta es una peque&amp;ntilde;a lista de los elementos del lenguaje de las expresiones regulares, puedes encontrar una referencia completa en MSDN, &lt;a target="_blank" rel="nofollow" href="http://msdn.microsoft.com/en-us/library/az24scfc.aspx"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Con esto, pongamos un ejemplo pr&amp;aacute;ctico, imaginad que est&amp;aacute;is analizando el texto de un archivo html y quer&amp;eacute;is encontrar todas las referencias a im&amp;aacute;genes jpg y almacenarlas en una lista de cadenas para descargarlas posteriormente, ser&amp;iacute;a tan sencillo como hacer esto:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span style="font-size:x-small;"&gt;(nota: esto es solo un ejemplo y bajo ciertas condiciones controladas, no identificar&amp;iacute;a correctamente todas las im&amp;aacute;genes en un html real, es solo una muestra)&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dim Patron As String = &amp;quot;src=&amp;#39;?&amp;amp;lt;imagen&amp;amp;gt;(http.*jpg)&amp;#39;\s+&amp;quot;&lt;br /&gt;Dim Expresion As New Regex(Patron, RegexOptions.IgnoreCase)&lt;br /&gt;Dim ListaImagenes As New List(Of String)&lt;br /&gt;&lt;br /&gt;For Each Coincidencia As Match In Expresion.Matches(InputText)&lt;br /&gt;ListaImagenes.Add(Coincidencia.Groups(&amp;quot;imagen&amp;quot;).Value)&lt;br /&gt;Next&lt;/p&gt;
&lt;p&gt;Como pod&amp;eacute;is ver es realmente sencillo usar expresiones regulares, son muy &amp;uacute;tiles para validaci&amp;oacute;n de entrada de texto, pod&amp;eacute;is definir varios patrones &amp;ldquo;no permitidos&amp;rdquo; y comprobar el texto que ha introducido el usuario en busca de ellos, por ejemplo pod&amp;eacute;is buscar un patr&amp;oacute;n SQL para evitar SQL Injection en aplicaciones Web o un patr&amp;oacute;n con el tipo de texto que el usuario debe introducir para verificar que el dato es correcto.&lt;/p&gt;
&lt;p&gt;He preparado un peque&amp;ntilde;o programa en VB.NET y WPF que os permite cargar un archivo de texto e introducir una expresi&amp;oacute;n regular a buscar en ese texto y os devuelve todas las coincidencias encontradas:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_7YCdMP8inuc/TIPTrfnfWPI/AAAAAAAAAH0/te8C-BmF5yM/s1600-h/Captura%5B6%5D.jpg"&gt;&lt;img height="646" width="957" src="http://lh6.ggpht.com/_7YCdMP8inuc/TIPTxwZTcrI/AAAAAAAAAH4/b2K_SQj2Isw/Captura_thumb%5B4%5D.jpg?imgmax=800" alt="Captura" border="0" title="Captura" style="display:inline;border-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 align="justify"&gt;Conclusi&amp;oacute;n&lt;/h4&gt;
&lt;p&gt;Bueno, las expresiones regulares son tan antiguas como la inform&amp;aacute;tica misma, pero son un recurso muy valioso hoy en d&amp;iacute;a, puesto que nos ofrecen una herramienta inestimable para validar, corregir y extraer informaci&amp;oacute;n de archivos sin formato predefinido, que de otra forma nos dar&amp;iacute;an dolores de cabeza.&lt;/p&gt;
&lt;p&gt;Espero que os haya gustado tanto leer este art&amp;iacute;culo como a mi escribirlo.&lt;/p&gt;
&lt;p&gt;Por si ten&amp;eacute;is alguna dificultad, a parte por supuesto de poder contactar conmigo tanto dejando mensajes, como en mi twitter, como en msdn o a mi email directamente, os dejo el proyecto completo para descarga. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Muchas gracias por leerme y &lt;strong&gt;Happy Coding&lt;/strong&gt;!&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;p&gt;&lt;a href="http://cid-fd100135b82f3364.office.live.com/self.aspx/.Public/ejemplos/Expresiones%20Regulares/RegularExpressions.zip?sa=135434598"&gt;Descargar C&amp;oacute;digo fuente.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description></item></channel></rss>