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
Las clases de caracteres son conjuntos de caracteres que representan 'opciones' para el mismo caracter dentro del patrón. Una clase de caracteres se delimita con [ y ]
Las clases de caracteres se utilizan en aquellos casos en los que se sabe que en la cadena deben aparecer un conjunto limitado de caracteres en una cierta posición.
Ejemplo: [sz]
Esta clase de caracteres coincidirá si, en el lugar del patrón en la que se ubica, hay una "s" o una "z".
patron: ca[sz]a
Se lee como: "una c, seguida de una a, seguida de una s o una z, seguida de una a".
Las cadenas "casa", "caza" y "me voy de casa" coinciden con el patrón.
Las cadenas "cata" y "cat" no coinciden.
Comentario importante: antes de intentar escribir un patrón, es necesario tener clara la estructura de la cadena que se va a a analizar. Si no se puede encontrar una estructura, no será posible escribir un patrón que funcione en todos los casos.
Notas
- El orden de los caracteres dentro de la clase es irrelevante: [sz] funciona igual que [zs]
- La clase no está limitada en la cantidad de caracteres que puede contener
- La clase solamente representa a un caracter presente: el patrón "Hol[abc]" coincide con "Hola", "Holb", "Holc", pero NO con "Hol".
- La clase solamente se compara con 1 caracter. Si se tiene el patrón
Hol[abc]$
Que quiere decir "que el final de la cadena sea una letra H, seguida de o, seguida de l, luego una letra a o b o c", la cadena "Hola" coincidirá (así como "Holb" y "Holc") pero "Holaa" no.
Rangos
Un rango es una clase de caracteres particular, en la que se incluye una lista abreviada.
Por ejemplo, si se necesita que el patrón coincida con un número cualquiera, se puede usar:
- La opción completa, con cualquiera de sus variantes (recuérdese que el orden dentro de la clase no es importante): [0123456789] o la equivalente [3452167809]
- Un rango, que define el primer caracter, el caracter final, y el metacaracter "-" (guión simple) entre ellos:
[0-9]
Características
Un rango no tiene por qué ser completo (en el caso de los números, no es necesario que sea 0-9): [2-4] es equivalente a [234].
Tampoco está limitado a números, funciona con letras también:
[a-z] = [abcdefghijklmnopqrstuvwxyz]
[e-m] = [efghijklm]
La clase de caracteres puede contener rangos y caracteres individuales, o varios rangos:
[0-9·"] es equivalente a [0123456789·"]
[a0-9z] equivale a [a0123456789z]
[0-9a-z]
[0-9a-z"·$]
Nota: en la mayoría de los motores de expresiones regulares, [a-z] no coincide con caracteres acentuados o con diéresis, ni con la letra ñ. Esto hace necesario que deban definirse específicamente, por ejemplo:
[0-9a-záéíóú]
Hacia el final del tutorial se hará un comentario más extenso sobre este punto.
Metacaracteres
Las clases tienen sus propios metacaracteres, que no necesariamente tienen el mismo significado dentro y fuera de la clase.
El guión
Como ya se comentó, si se coloca entre dos caracteres cualesquiera, provocará que el motor intente generar un rango entre ambos. Esto no es siempre lo que se busca, si por accidente la clase de caracteres termina siendo
[4-a]
con la intención de que coincida con "un 4, un guión o una a", el patrón no será válido (no se puede generar un rango entre el 4 y la a).
Por lo que, si se desea encontrar un guión en el texto, se lo debe colocar al comienzo o al final de la clase de caracteres (justo después de [ o justo antes de ]). En ese caso, al no estar entre 2 caracteres de la clase, no adquiere su 'metacomportamiento'.
El acento circunflejo
Dentro de la clase de caracteres el acento circunflejo (^) pierde su comportamiento de ancla, y se transforma en un operador de negación.
Esto es útil cuando no se busca que cierto caracter esté en la cadena, sino que se busca que NO esté.
Ejemplo: Si se quiere validar que una cadena contenga cualquier caracter que no sea un número, se puede usar
[^0123456789]
O, en notación de rango:
[^0-9]
Es importante destacar que, para que el ^ adquiera su metacomportamiento, debe ir ubicado inmediatamente después de [. En el patrón
[0-9^a-z]
no se indica "un número o un caracter que no sea una letra" sino "un número, una letra o un ^"
Un ejemplo más:
Los metacaracteres pueden combinarse, el patrón
^[^0-9]
representa a una cadena que comienza (^) con algo que NO ([^) es un número (0-9).
Nota: Anteriormente se mencionó que para ser tomado literalmente, el guión (-) debe ir a continuación de [ o antes de ]. Hay una tercera opción: un guión ubicado a continuación de ^ también será tomado literalmente.
Resumen para las clases de caracteres
Las clases de caracteres se utilizan cuando se tienen opciones sobre caracteres en ciertas partes de la cadena, por ejemplo si se sabe que la cadena comienza (o DEBE comenzar para ser aceptada como válida) con un número, pero puede ser cualquier número, se puede utilizar el siguiente patrón:
^[0-9]
Una clase únicamente representa a 1 caracter de la cadena, y únicamente a un caracter presente, es decir, debe haber un caracter para poder coincidir:
Hol[^a]
Coincide con 'Holo', 'Hole', pero NO con 'Hol'.
Las clases tienen sus propios metacaracteres, ocurriendo a veces que el mismo caracter tiene un significado fuera de la clase, al comienzo de la misma, o incluso dentro de la clase pero no al comienzo, siendo el acento circunflejo ^ ejemplo de esto.
Los metacaracteres para las clases son:
- - (guión): si está en los extremos de la clase, solo representa a un guión, pero si no está en los extremos sirve para formar un rango entre los caracteres adyacentes: en [-a] solo representa a un guión, mientras que en [0-9] forma el rango que representa a los números entre 0 y 9 (Nota: el rango [1-3] representa números entre 1 y 3, no es obligatorio representar a un rango completo)
- ^ (circunflejo): únicamente es metacaracter si está al comienzo de la clase. Representa la negación, es decir, que para que se produzca una coincidencia los caracteres que forman la clase NO deben estar presentes.
- [, ] : son metacaracteres por el hecho de limitar la clase, si se requiere incluir alguno de los dos en la clase se debe escapar colocándole una barra '\' delante, para que se lo tome literalmente.
Comentario sobre lo comentado
Solamente se han mencionado unos pocos puntos sobre las expresiones regulares, sin embargo eso basta para construir muchos patrones relativamente complejos.
Ejemplo: Se supone que una fecha debe estar formada por dos números representando el día, dos números representando el mes y cuatro números representando el año, cada parte separada por una barra ("/") o un guión ("-").
Se puede construir entonces el siguiente patrón, que cumple estas reglas
^[0-3][0-9][-/][0-1][0-9][-/][0-2][0-9][0-9][0-9]$
Que literalmente significa:
^ La cadena comienza
[0-3] Con un número entre cero y tres (ya que no hay días 40)
[0-9] Sigue con otro número
[-/] Luego hay un guión o una barra (nótese que el guión al comienzo de la clase no tiene su significado especial)
[0-1] Lo sigue un número entre cero y uno (ya que no hay mes 20)
[0-9] Luego otro número
[-/] Otro guión o barra
[0-2] Luego un número entre cero y dos (ya que no hay año 3000, al menos en el calendario cristiano)
[0-9][0-9][0-9] y luego tres números más
$ al final de la cadena.









