Serie: Expresiones Regulares
- Expresiones regulares: Introducción
- Metacaracteres: Anclas
- Exp. Regulares: Clases de caracteres
- Clases de caracteres predefinidas
- Paréntesis, escape de caracteres, y alternación de patrones
- Cuantificadores
- Tipos de coincidencias y referencias
- Diferencias de sintaxis entre POSIX y Perl
- Expresiones regulares con PHP - POSIX
- Expresiones regulares con PHP - Perl
Ya habiendo terminado la descripción del lenguaje en el que se escriben las expresiones regulares, es hora de conocer algunas características relacionadas directamente con su uso en programas.
Las funciones de expresiones regulares
Las expresiones regulares tienen dos usos principales: validación de datos y búsqueda de información en cadenas cuya forma se conoce. También se pueden utilizar para separar una cadena en partes, pero esta es una característica poco usada.
Los lenguajes de programación proveen normalmente diferentes funciones para las diferentes tareas:
- Funciones de coincidencia total: devuelven un valor verdadero si la cadena completa coincide con el patrón.
- Funciones de coincidencia parcial: se encargan de recorrer la cadena buscando y almacenando las coincidencias del patrón con partes de la cadena.
- Funciones de separación: dividen a la cadena en partes, usando una expresión regular como separador.
- Funciones de reemplazo de texto: reemplazan las partes de la cadena original que coinciden con el patrón con una cadena predefinida.
En próximas partes de esta serie se describirá el uso de expresiones regulares en varios lenguajes. Por ahora, vale mencionar que si se habla de PHP, las funciones que cumplen los puntos anteriores son ereg (puntos 1 y 2), split (punto 3) y ereg_replace (punto 4).
Tipos de coincidencia
El tipo de coincidencia de un patrón con una cadena puede ser total o parcial. Es decir, si el patrón debe coincidir con la cadena completa (como en el caso de una validación, por ejemplo validación de direcciones de correo electrónico) se dice que la coincidencia es total.
En otros casos se tienen cadenas de texto (a veces muy grandes) que tienen dos cualidades:
- La información que interesa es solamente una parte de la cadena completa
- Su forma es conocida
Es importante recalcar que la forma de la cadena es conocida: si no fuera así no podría escribirse un patrón que tomara solamente las partes que interesan.
En estos casos en los que lo que importa es obtener datos de la cadena principal, incluso haciendo coincidir al patrón más de una vez en la cadena completa, se dice que la coincidencia es parcial
Las coincidencias parciales serían muy poco útiles de no ser por una característica fundamental de los motores de expresiones regulares: las referencias.
Referencias
En las partes anteriores se describió la forma en la que trabajan los paréntesis, agrupando partes del patrón a las que se les debe aplicar un operador (|, *, +, {}).
Otra función de los paréntesis, la que se explicará en esta parte, es indicar qué partes del patrón interesa conservar, para así obtener información de la cadena analizada.
Mejor expresado: La parte de la cadena que coincida con el patrón encerrado entre paréntesis será guardada y accesible luego de que el patrón se aplique sobre la cadena.
Dado que puede existir más de un juego de paréntesis, el motor de expresiones regulares otorga a cada juego un índice comenzando en 1 y hasta 9, contando desde la izquierda. El índice cero será la parte de la cadena que coincide con el patrón.
Ejemplo
Si el patrón es
<a href="([^"]*)">([^<]*)</a>
y la cadena es un enlace normal
<a href="http://alvlin.com">¡Visita mi sitio!</a>
La función que se utilice para comparar el patrón contra la cadena devolverá un vector de la siguiente forma:
vector[0] = '<a href="http://alvlin.com">¡Visita mi sitio!</a>'
vector[1] = 'http://alvlin.com'
vector[2] = '¡Visita mi sitio!'
Si no se desea que un juego de paréntesis "capture" la parte de la cadena que coincida con él, se debe agregar ?: inmediatamente después del paréntesis de apertura. En el ejemplo, si no se desea que se capture el texto del enlace, puede escribirse el patrón de la siguiente forma:
<a href="([^"]*)">(?:[^<]*)</a>
Esto es útil para hacer al patrón un poco más eficiente (ya que capturar el trozo de cadena requiere algo de procesamiento extra) y además puede servir para patrones complejos que usen muchos juegos de paréntesis, dado que solamente se pueden capturar 9 "trozos".
Referencias "normales" (referencing)
Se utilizan en las funciones de reemplazo de texto, normalmente como \\x, donde x es el índice del juego de paréntesis correspondiente.
Ejemplo
Un ejemplo muy común es la "traducción" de etiquetas BBCode en HTML. Para convertir
[b]Texto en Negrita[/b]
en
<strong<Texto en Negrita</strong>
se puede utilizar la siguiente llamada a ereg_replace (en PHP):
ereg_replace('[b](.*?)[/b]', '<strong>\\1</strong>', '[b]Texto en Negrita[/b]');
En este ejemplo, "\\1" hace referencia al primer juego de paréntesis. El motor de expresiones regulares lo sustituirá por la parte de la cadena que coincida con el patrón encerrado en ese primer juego de paréntesis.
Referencias hacia atrás (back referencing)
Otra forma de referencia es la referencia hacia atrás, también conocida como back referencing. En este caso no se utiliza para sustituir texto, sino por ejemplo para encontrar palabras duplicadas. El patrón:
(wiki)\\1
Coincide con "wikiwiki".
Esta forma de referencia no se utiliza demasiado, y no es soportada por los motores POSIX.
De todas formas es interesante que exista.










