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
En este capítulo se presenta el metacaracter de alternación, "|". Pero antes de describirlo se mencionan algunos caracteres que si bien no se consideran "meta", tienen un significado especial: los paréntesis y la barra "\", que sirve para escapar los caracteres con significado especial.
Los paréntesis
Los paréntesis ( "(" y ")" ) tienen dos usos principales:
- Delimitar el alcance de un cuantificador: Por defecto los cuantificadores toman la mayor cantidad de caracteres posible como el patrón a "cuantificar", pero esto no es siempre lo que se necesita. Por ejemplo:
hola?
no es lo mismo que
hol(a)?
El caracter ? es un cuantificador que quiere decir "uno o ninguno" (se verá en el capítulo correspondiente). El primer patrón se lee como "la secuencia 'hola' o nada", mientras que el segundo se lee "la secuencia 'hol' seguida o no de una 'a'".
Visto de otro modo, el primer patrón coincide con la palabra "hola" y con una cadena vacía, mientras que el segundo coincide con "hol" y con "hola" - Referencia al contenido que coincide: El trozo de cadena que coincide con la parte del patrón encerrada entre paréntesis se guardará y se podrá usar más adelante. Por ejemplo:
(Hola)?, cómo estás
No solamente coincide con la cadena "Hola, cómo estás" sino que además, al coincidir, la palabra "Hola" se guardará en una variable para su uso posterior.
Esta funcionalidad es mejor explicada con ejemplos de código, que se incluirán en posteriores capítulos de esta serie. Lo importante es recordar que esta es una de las características más usadas, y que permite manipular cadenas de datos de forma sencilla.
Escape de caracteres
Dado que hay caracteres que tienen un significado especial para el motor de expresiones regulares, el intentar buscar explícitamente alguno de ellos puede ser problemático.
Tomando como ejemplo al punto, y suponiendo que se quiere encontrar "alvlin.com", se podría intentar utilizar este patrón:
alvlin.com
Que afortunadamente coincidiría con "alvlin.com", pero lamentablemente también con "alvlin#com", "alvlinacom", "alvlin!com", etc. El motivo es que, como se mencionó en partes anteriores, el punto representa a cualquier caracter.
La solución a este problema, que se produce con cualquiera de los metacaracteres, es preceder con una barra "\" al caracter cuyo "metacomportamiento" el motor debe olvidar. Es decir, si se necesita que un punto en el patrón represente únicamente a un punto y no a otro caracter, el patrón de ejemplo debe escribirse como:
alvlin\.com
El metacaracter de alternación: |
El metacaracter | significa "O", es decir "un patrón o el otro".
Se usa cuando se necesita buscar más de un tipo de secuencia de caracteres a la vez, o cuando se conoce que las cadenas a analizar contienen partes ligeramente diferentes, pero son iguales en otras.
En estos casos, se escriben al menos dos patrones que, unidos a través de la "|", harán que la comparación sea exitosa si cualquiera de ellos coincide con la forma de la cadena.
Ejemplo 1
Por ejemplo, suponiendo un archivo como el siguiente (un diario personal, o un calendario):
Lunes: asdlñfkhadflh1o2333fdafdf Martes: añsdlkfher8y43r10uerfrfdmslsdfgbf Miércoles: tggggggfodfuhvbnvcleortgb [continúa] Lunes: 102354ty8ghfjdoiskcivjnvmc [continúa]
Y suponiendo que se quiere analizar su contenido para obtener solamente aquellas líneas que comienzan con "Lunes:" o "Martes", se puede usar un patrón como el siguiente:
Lunes:|Martes:
Por defecto la alternación se aplica como "todo lo que esté antes de | O todo lo que esté después".
Esto hace que el ":" al final de cada día no pueda llevarse al final
Lunes|Martes:
Ya que este patrón coincide con "Lunes" o con "Martes:".
Para delimitar el campo de acción del operador, se pueden usar los paréntesis:
(Lunes|Martes):
Este patrón coincide se lee como: "Lunes" o "Martes", cualquiera de los dos seguido por un ":".
Ejemplo 2
Una falta de ortografía muy común es targeta (una g donde debería ir una j). Si la idea es encontrar cualquiera de las dos "versiones" de la palabra, hay varios caminos posibles:
- Clase de caracteres:
tar[gj]eta - Alternación (con paréntesis para dejar claro el campo de acción de |):
tar(j|g)eta - Alternación:
tarjeta|targeta
Esta última forma demuestra una ventaja de la alternación sobre las clases de caracteres: con | se pueden usar como 'opciones' cadenas y patrones tan complejos como se necesite, mientras que en una clase solamente se pueden listar caracteres individuales (o alguna de las clases predefinidas, que en realidad no son otra cosa que listados de caracteres).
Vale la pena observar que tar[g|j]eta no sirve, ya que dentro de una clase de caracteres '|' pierde su significado especial.
Tampoco funciona targ|jeta porque el significado de ese patrón es "targ O jeta"
Jugando con las anclas
Usadas con descuido, las anclas (^ y $) dentro de cada alternativa pueden llevar a resultados inesperados. Volviendo al Ejemplo 1, si se lee con atención se notará que la intención es coincidir con "Lunes" o "Martes" al comienzo de cada línea.
Los patrones propuestos hasta ahora no usan ningún ancla, por lo que no cumplen que la palabra deba estar al principio.
Si se hace sin cuidado, podría escribirse este patrón:
^Lunes:|Martes:
Que, en vez de coincidir con "la palabra 'Lunes' o la palabra 'Martes' al principio de la cadena" coincide con "La palabra 'Lunes' al principio de la cadena, o la palabra 'Martes' en cualquier lugar de la misma". Esto sucede porque no se han usado paréntesis para delimitar el efecto de |. El patrón funciona correctamente si se agregan los paréntesis adecuados:
^(Lunes|Martes):
Que es equivalente a utilizar combinados los siguientes 2 patrones:
^Lunes:
^Martes:
Cabe mencionar que
^(Lunes|Martes):
es equivalente al más largo pero quizás más entendible
^Lunes:|^Martes:
Las alternativas no pueden "negarse" como se hace con las clases de caracteres: no se puede hacer "que esté X o que NO esté Y". Sin embargo, como cada alternativa es un patrón completo, siempre pueden hacerse las negaciones necesarias en el patrón (en la alternativa) mismo.
Como último comentario, mencionar que el número de alternativas que se pueden utilizar no está limitado, en los ejemplos siempre se utilizaron dos pero pueden utilizarse tantas alternativas como sean necesarias. El patrón
^(Lunes|Martes|Miércoles|Jueves|Viernes|Sábado|Domingo):
es perfectamente válido.










17/05/2009, a las 03:42
De maravilla he leido estos 5 capitulos y creo que soy experto haha… muy buenos y practicos.