| Artículos | 01 ABR 2006

Expresiones regulares

Tags: Histórico
Gonzalo Alvarez.
Las expresiones regulares se vienen usando desde tiempos inmemoriales en Unix en editores de texto y utilidades de búsqueda de literales de texto. Un sencillo ejemplo seguramente familiar para los lectores es el uso de metacaracteres como? y * para representar nombres genéricos de archivos en MS-DOS. Este mes te mostramos los trucos básicos para utilizar expresiones regulares en la validación de entrada de aplicaciones web.

Cómo representar caracteres ordinarios
Se corresponden con todos aquellos caracteres, tanto imprimibles como no imprimibles, que no son metacaracteres (ver Tabla 1). Un carácter ordinario dentro de una expresión regular se corresponde consigo mismo dentro de una cadena. Así, la expresión /g/ ajusta la aparición de una g en cualquier posición dentro de una cadena. Mientras que la expresión regular /10/ ajusta la aparición de esos dos dígitos dentro de una cadena, en ese orden y contiguos, como en 1000 o TOP10, pero no en 120. Por su parte, la expresión regular /cripto/ ajusta cadenas como criptografía, criptología o criptonomicón, pero no cripta.

Cómo representar caracteres especiales
Los metacaracteres poseen un significado propio, explicado en la Tabla 1, cuando aparecen dentro de una expresión regular, por lo que si se desea que sean considerados como un carácter ordinario deben precederse de la barra hacia atrás (\).

Cómo representar caracteres no imprimibles
Son aquellos caracteres que no aparecen en pantalla (o en papel), pero que se utilizan para dar formato al texto, como tabuladores, retornos de carro, etc., enumerados en la Tabla 2.

Cómo ajustar caracteres
Los caracteres punto (.), interrogación (?), más (+) y asterisco (*) permiten ajustar cualquier otro carácter. Por ejemplo, la expresión regular /cal.e/ ajusta con callejón, pero no con calera. La expresión regular /cal?e/ ajusta con calera o caerse, pero no con callejón. Por su lado, la expresión regular /cal+e/ ajusta con calera y con callejón, pero no con caerse. Para ajustar con todas ellas haría falta la expresión regular /cal*e/.

Cómo usar los corchetes
En los ejemplos anteriores hemos visto que el orden en que aparecen los caracteres dentro de la expresión regular determina el ajuste de cadenas si los caracteres aparecen en ellas en exactamente el mismo orden. También se puede crear una lista de caracteres que deban ajustar a una cadena, pero sin importar su posición dentro de la misma. Para ello se utilizan las expresiones entre corchetes.
Cualquier carácter ordinario dentro de una expresión entre corchetes se representa a sí mismo, mientras que los metacaracteres pierden su significado, pasando a ser considerados como caracteres ordinarios, con la excepción del carácter ], que se considera como terminador de la lista a menos que aparezca inmediatamente detrás del carácter [; y del carácter \, que continúa comportándose como el carácter de escape.
Todos los caracteres englobados dentro de una expresión entre corchetes representan la aparición de un único carácter. Por lo tanto, la expresión regular /alvarez[123]\.mp3/ ajusta con las cadenas alvarez1.mp3, alvarez2.mp3 y alvarez3.mp3, pero no con alvarez12.mp3. Ten en cuenta que el carácter punto (.) se ha precedido del carácter de escape (\) para que sea considerado como un literal en lugar de como un metacarácter.
Las expresiones entre corchetes también permiten representar un conjunto de caracteres sin necesidad de enumerar individualmente todos sus elementos. Basta con indicar el rango al que pertenecen, utilizando como separador el guión (-). Por ejemplo, la expresión regular /[0-9]/ ajusta cualquier dígito una sola vez, mientras que la expresión regular /[a-mA-M]/ ajusta cualquier letra desde la a a la m, en mayúsculas o minúsculas, una sola vez.
Incluso se pueden crear rangos con otros símbolos no alfanuméricos, con la condición de que aparezcan en orden Unicode, como por ejemplo /[:-@]/ que ajusta la aparición de cualquiera de los caracteres :, ;, <, =, >, ? o @.
El uso del metacarácter negación (^) sirve para encontrar todos los caracteres que no ajustan a la lista o rango de la expresión entre corchetes. Este metacarácter debe aparecer en la primera posición de la expresión entre corchetes, ya que en caso contrario se representaría a sí mismo. Por ejemplo, para ajustar todas las cadenas que no posean los caracteres w, x, y ni z se emplearía la expresión regular /[^wxyz]/ o más brevemente /[^w-z].
Una forma de representar mediante expresiones entre corchetes los caracteres alfanuméricos sería mediante la expresión regular /[a-zA-Z0-9]/ o aún más abreviadamente /\w/.

Cómo cuantificar
Dado que no siempre se sabe con antelación cuántos caracteres se van a ajustar, las expresiones regulares incorporan los cuantificadores, los cuales indican cuántas veces debe aparecer un elemento de la expresión regular para que se considere un ajuste. En trucos anteriores ya se han visto los cuantificadores *, + y ?, a los que se conoce como avariciosos (greedy), ya que siempre intentan ajustar el mayor número posible de caracteres. En la Tabla 3 se listan otros junto con su significado.
Puedes comprobar fácilmente cómo las siguientes expresiones regulares son equivalentes:

/gon*/ <==> /gon{0,}/
/gon+/ <==> /gon{1,}/
/gon?/ <==> /gon{0,1}/

Supongamos que en el archivo que almacena un libro en formato electrónico se están buscando las apariciones de la numeración de las páginas. En dicho libro, la numeración es de la forma ‘capítulo-página’. Para localizar en una página del capítulo 5 los números de la paginación se puede emplear /5-[0-9]+/.
Se puede apreciar cómo detrás de 5- se espera un número comprendido entre 0 y 9 una o más veces. De forma más compacta se escribiría /5-\d+/.

Cómo anclar contenido
En algunas situaciones podemos desear encontrar un patrón en una posición determinada del texto y no en cualquier lugar. Por ejemplo, los números de página del truco anterior aparecerán en una sola línea a pie de página, mientras que dentro del texto pueden aparecer referencias a los números de página. Si lo que interesa es localizar los números y no sus referencias hay que recurrir a las anclas.
Las anclas (anchors), listadas en la Tabla 4, especifican si una expresión debe aparecer al principio de una línea, al final de una línea o en una línea sola. En cuanto a palabras, permiten especificar si una expresión regular aparece al principio, al final o en el interior de una palabra. Un extremo de palabra es la posición entre la palabra y el espacio. Un extremo que no sea de palabra es cualquier otra posición.
Siguiendo con el ejemplo de la paginación, si tenemos en cuenta que la paginación aparece en una línea sola, podemos afinar aún más exigiendo que ese patrón aparezca aislado en una línea, sin otros caracteres por delante ni por detrás: /^5-\d+$/.
Ahora bien, como sabemos que el número de páginas no excede de 100, no es necesario permitir uno o más dígitos, en su lugar se puede exigir que haya sólo dos: /^5-\d{1,2}$/.
Por último, si se quisiera evitar que pudiera colarse un número de página ilegal como 5-0, podría rescribirse la expresión regula

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información