¿Que son las Expresiones Regulares?
Son una serie de carácteres que forman un patrón, normalmente representativo de otro grupo de carácteres mayor, de tal forma que podemos comparar el patrón con otro conjunto de carácteres para ver las coincidencias.
Las expresiones regulares estan disponibles en casi cualquier lenguaje de programación, pero aunque su sintaxis es relativamente uniforme, cada lenguaje usa su propio dialecto.
Si es la primera vez que te acercas al concepto de expresiones regulares te animará saber que seguro que ya las has usado, aún sin saberlo.
Por ejemplo, cuando en una ventana del BASH ejecutamos ls *.sh
para obtener un listado de todos los archivos de un directorio, estamos utilizando el concepto de expresiones regulares, donde el patrón * coincide con cualquier cadena de caracteres.
// este es nuestro patrón. Si lo comparamos con:
am // coincide
panorama // coincide
ambicion // coincide
campamento // coincide
mano // no coincide
?>
Se trata sencillamente de ir comparando un patrón (pattern) que en este ejemplo es la secuencia de letras 'am'- con una cadena (string) y ver si dentro de ella existe la misma secuencia. Si existe, decimos que hemos encontrado una coincidencia (match, en inglés).
Otro ejemplo:
patrón: elel ala aleve del leve abanico
Caracteres y Meta Caracteres
Nuestro patrón puede estar formado por un conjunto de carácteres (un grupo de letras, numeros o signos) o por meta caracteres que representan otros carácteres, o permiten una búsqueda contextual.
Los meta-caracteres reciben este nombre porque no se representan a ellos mismos, sino que son interpretados de una manera especial.
He aqui la lista de meta caracteres mas usados:
. * ? + [ ] ( ) { } ^ $ | \
Los signos ^ y $ sirven para indicar donde debe estar situado nuestro patrón dentro de la cadena para considerar que existe una coincidencia.
Cuando usamos el signo ^ queremos decir que el patrón debe aparecer al principio de la cadena de carácteres comparada.
Cuando usamos el signo $ estamos indicando que el patrón debe aparecer al final del conjunto de carácteres.
O mas exactamente, antes de un caracter de nueva linea
Asi:
^am // nuestro patrón
am // coincide
cama // no coincide
ambidiestro // coincide
Pam // no coincide
Pamela // no coincide
am$
// nuestro patrón
am // coincide
salam // coincide
ambar // no coincide
Pam // coincide
^am$
am // coincide
salam // no coincide
ambar // no coincide
?>
o como en el ejemplo anterior:
patrón: ^elel ala aleve del leve abanico
Escapando Caracteres
Puede suceder que necesitemos incluir en nuestro patrón algun metacaracter como signo literal, es decir, por si mismo y no por lo que representa. Para indicar esta finalidad usaremos un carácter de escape, la barra invertida \.
Así, un patrón definido como 12\$ no coincide con una cadena terminada en 12, y sí con 12$:
el ala aleve del leve abanico cuesta 100$
patrón: 100\$
el ala aleve del leve abanico cuesta 100$
Fijate en los ejemplos anteriores. En el primero, no hay coincidencia, porque se interpreta "busca una secuencia consistente en el número 100 al final de la cadena", y la cadena no termina en 100, sino en 100$.
Para especificar que buscamos la cadena 100$, debemos escapar el signo $
Como regla general, la barra invertida \ convierte en normales caracteres especiales, y hace especiales caracteres normales.
Las funciones básicas de expresiones regulares para comparar una cadena con un patrón son ereg($patron, $cadena) y eregi($patron, $cadena).
La diferencia entre ellas es que ereg() distingue entre mayúsculas y minúsculas y eregi() no.
Estas funciones comprueban si la cadena cumple el patrón y devuelven el valor 1 (verdadero) o 0 (falso). Los argumentos de las funciones pueden ser cadenas o variables que contengan cadenas. Si el patrón es la cadena vacía, las funciones devuelven error.
Ejemplo:<?php
$cadena1 = "1234567";
$cadena2 = "abcdefg";
$patron = "^[[:digit:]]+$";
if (eregi($patron, $cadena1)) {
echo "<p>La cadena $cadena1 son sólo
números.</p>";
} else {
echo "<p>La cadena $cadena1 no son sólo
números.</p>";
}
if (eregi($patron, $cadena2)) {
echo "<p>La cadena $cadena2 son sólo
números.</p>";
} else {
echo "<p>La cadena $cadena2 no son sólo
números.</p>";
}
?>
Patrón | Significado |
---|---|
. | cualquier carácter |
^c | empezar por el carácter c |
c$ | terminar por el carácter c |
c+ | 1 o más caracteres c |
c* | 0 o más caracteres c |
c? | 0 o 1 caracteres c |
\n | nueva línea |
\t | tabulador |
\ | escape, para escribir delante de caracteres especiales: ^ . [ ] % ( ) | * ? { } \ |
(cd) | caracteres c y d agrupados |
c|d | carácter c o d |
c{n} | n veces el carácter c |
c{n,} | n o más caracteres c |
c{n,m} | desde n hasta m caracteres c |
[a-z] | cualquier letra minúscula |
[A-Z] | cualquier letra mayúscula |
[0-9] | cualquier dígito |
[cde] | cualquiera de los caracteres c, d o e |
[c-f] | cualquier letra entre c y f (es decir, c, d, e o f) |
[^c] | que no esté el carácter c |
[[:alnum:]] | cualquier letra o dígito (pero no vocales acentuadas, ñ, ç, etc.) |
[[:alpha:]] | cualquier letra (pero no vocales acentuadas, ñ, ç, etc.) |
[[:digit:]] | cualquier dígito |
[[:lower:]] | cualquier letra minúscula (pero no vocales acentuadas, ñ, ç, etc.) |
[[:punct:]] | cualquier marca de puntuación |
[[:space:]] | cualquier espacio en blanco |
[[:upper:]] | cualquier letra mayúscula (pero no vocales acentuadas, ñ, ç, etc.) |
Ejemplos de Expresiones Regulares
Patrón | Cadena | ¿Cumple? | Comentario |
---|---|---|---|
abc | awbwc | No | Los caracteres tienen que estar seguidos. |
34abc | Sí | No importa que hayan caracteres antes... | |
cbabcba | Sí | ... o después. | |
a2b | g1da2b3 | Sí | Las expresiones regulares detectan letras, números, ... |
áb | 3áb4 | Sí | ... incluso acentos, ... |
a\$b | 1a$b2 | Sí | ... salvo los caracteres ^ . [ $ ( ) | * + ? { \ € que deben llevar una contrabarra \ antes, además de \n (nueva línea) y \t (tabulador) |
[aeiou] | bic | Sí | Los corchetes definen los caracteres admitidos en una posición ... |
bcd | No | ||
[^aeiou] | bic | Sí | ... o no admitidos |
aei | No | ||
[p-t] | avr | Sí | Se pueden definir rangos de caracteres... |
av1 | No | ||
[B-D] | PMD | Sí | ... en minúsculas o mayúsculas ... |
AV1 | No | ||
[0-9] | b9d | Sí | ... o números |
bcd | No | ||
[[:alpha:]] | Cualquier carácter alfabético (sin acentos) | ||
[[:digit:]] | Cualquier número | ||
[[:alnum:]] | Cualquier número o carácter alfabéticos (sin acentos) | ||
[[:punct:]] | Cualquier carácter que no sean letras y números (menos el euro) | ||
[[:space:]] | Cualquier tipo de espacio en blanco | ||
[[:upper:]] | Cualquier mayúscula (sin acentos) | ||
[[:lower:]] | Cualquier minúscula (sin acentos) | ||
^ab | cab | No | Los caracteres tienen que estar al principio |
abc | Sí | No importa que hayan caracteres después | |
ab$ | abc | No | Los caracteres tienen que estar al final |
cab | Sí | No importa que hayan caracteres antes | |
^ab$ | ab | Sí | Tiene que empezar y acabar por aba ... |
abab | No | ... y no puede haber nada antes o después | |
ab?c | abcde | Sí | El carácter b puede estar entre a y c... |
acde | Sí | ... o no estar entre a y c ... | |
adcde | No | ... pero no puede haber otro carácter | |
a.c | abc | Sí | El . representa cualquier carácter ... |
a c | Sí | ... incluso el espacio el blanco, ... | |
abdc | No | pero sólo un carácter | |
ab+c | abcde | Sí | El carácter b puede estar una vez... |
abbbcde | Sí | ... o varias ... | |
acde | No | ... pero tiene que estar al menos una vez. | |
ab*c | abcde | Sí | El carácter b puede estar una vez... |
abbbcde | Sí | ... o varias ... | |
acde | Sí | ... o ninguna. | |
ab{3}c | abbbc | Sí | Las llaves indican el número exacto de repeticiones del carácter, ... |
abbbbc | No | ... no puede haber más ... | |
abbc | No | ... ni menos. | |
ab{2,4}c | abc | No | Se pueden definir rangos con límite inferior e inferior |
abbc | Sí | ||
abbbc | Sí | ||
abbbbc | Sí | ||
abbbbbc | No | ||
ab{2,}c | abc | No | Se pueden definir rangos sin límite superior |
a(bc){2}d | abcbcd | Sí | Los paréntesis definen agrupaciones de caracteres. En este caso bc tiene que aparecer repetido |
a(bc)?d | abcd | Sí | Aquí bc puede estar ... |
ad | Sí | ... o no estar, ... | |
abd | No | ... pero no puede aparecer sólo la b, o sólo la c u otro carácter | |
a(b|d)c | abc | Sí | Entre la a y la c puede estar el carácter b... |
adc | Sí | ... o el carácter d, ... | |
abdc | No | ... pero no los dos, ... | |
ac | No | ... ni ninguno de ellos. | |
^(ab)|(dc)$ | abc | Sí | Está la pareja ab ... |
adc | Sí | ... o dc ... | |
abdc | Sí | ... o las dos, ... | |
ac | No | ... pero no ninguna | |
^(ab)$|^(dc)$ | abc | No | Está la pareja ab, pero sobra la c ... |
adc | No | ... o está la pareja dc, pero sobra la a. | |
dc | Sí | Está una de las dos |
No hay comentarios.:
Publicar un comentario