
Los objetivos de este curso son:
Las expresiones regulares son patrones de caracteres, que mediante un motor correspondiente, nos ayuda a encontrar coincidencias en otro texto de entrada.
Las expresiones regulares no son consideradas un lenguaje de programación, ya que no cuenta con variables, ciclos, funciones, etc.
1943: Warren McCuloch y Walter Pitts crearon las bases de las expresiones regulares para la neurociencia.
1956: Stephen Kleene le da un modelo algebraico y las nombra “expresiones regulares”
1968: Ken Thompson integra las “regex” a un editor UNIX: ed.
g/Regular expression/p = grep
1970: grep se convierte muy popular en UNIX (awk, vi, emacs)
1980: grep se convierte en egrep (extended)
Cada lenguaje puede ser compatible con los tres motores (o sabores):
POSIX BRE
POSIX ERE
PCRE
Incluso puede cambiar el motor dependiendo de la versión del lenguaje, por ejemplo Apache v1 soporta POSIX ERE y la versión 2 soporta PCRE.
PHP y MySQL soportan POSIX EREs, pero PHP también soporta PCRE.
En este curso se utilizará una herramienta gratuita basada en JavaScript en la URL regexpal.com
/re/
/re/g Búsqueda global
/re/i Mayúsculas y minúsculas
/re/m Multilíneas
/re/s Validar el salto de línea
Apuntes sección 1: Introducción a las expresiones regulares
El manejo de los caracteres literales en las expresiones regulares
Los caracteres “literales”, son las expresiones regulares más sencillas.
La letra “a” empata con la letra “a”
/agua/ empata con “agua”
/agua/ empata con “aguacate”
/agua/ empata con “Nicaragua”
Puede haber cambios dependiendo del motor “regex”
Pueden tener más de un uso, depende de su contexto.
^ Inicio la regex
$ Fin de la regex
{} Repetición
() Agrupamiento
. (punto) cualquier caracter excepto el salto de línea
/man./ empata con “mana” “mano” “manx”
/9.99/ empata con “9.99”. “9999”, “9x99”, “9 99”
Para validar el salto de línea con el comodín punto usamos el modificador “s”
/9.99/s
/.a.a.a/ banana papaya *a*a*a
Secuencias de escape en las expresiones regulares:
\ Con la diagonal invertida (backslash) escapamos a los metacaracteres
La diagonal invertida no “escapa” a las literales, sólo metacaracteres.
Las comillas no “escapan” metacaracteres.
\.
/9\.99/
/foto.\.jpg/ empata con foto1.jpg foto2.jpg, pero no foto33.jpg
Otros caracteres especiales en el manejo de las expresiones regulares:
El espacio no es caracter especial. Un espacio debe coincidir con otro espacio.
Para representar un tabulador utilizamos \t
Retornos de línea \r, \n, \r\n
escape \e, cambio de página \f, tabulador vertical \v
Caracteres ASCII o ANSI:
0xA9 = \xA9
Apuntes sección 2: caracteres y metacaracteres
Definir un conjunto de caracteres:
Podemos definir un conjunto de caracteres por medio de los “corchetes” (Square Brackets) [ ]
/[aeiou]/
/[áéíóú]/
Sólo evalúa caracteres, no palabras.
El orden de los caracteres no importa.
/m[aeiu]sa/ empata con “masa”, “mesa”, “misa” y “musa” no con “mosa”
Por medio del renglón medio” (-) podemos abreviar los rangos de caracteres, por ejemplo:
[A-Z]
Representan todos los caracteres entre ambos.
Debes escribirse en orden. No es válido
[Z-A]
Sólo utilizamos caracteres, no conjunto de caracteres:
[40-45]
No representa de 40 a 45, sino 4, de 0 a 4 y 5.
Podemos escribir diferentes grupos de caracteres:
[A-Za-z0-9]
No incluye vocales acentuadas, eñes, etc., sólo las letras del abecedario inglés.
El caracter ^ (circunflejo) dentro de los corchetes es una negación de uno de los conjuntos de caracteres.
“Ninguno de los caracteres marcados”
Se escribe al inicio, dentro del conjunto de caracteres:
[^aeiou]
[^"#$%&/()=*]
Los metaracteres dentro de los conjuntos de caracteres ya están “escapadas”.
No hay necesidad de “escaparlos” nuevamente.
m[ao.xcv]lo malo, m.lo, pero no mulo
Los siguientes metacaracteres si hay que “escaparlos”
] - ^ \
var[[(][0-9][\])] por ejemplo var(9) var[9]
Abreviaciones conjunto de caracteres
\d Dígitos [0-9]
\w Caracteres [a-zA-Z0-9_] (no incluye el punto)
\s Espacios en blanco [ \t\r\n]
\D No dígito [^0-9]
\W No caracteres [^a-zA-Z0-9_]
\S No espacios en blanco [^ \t\r\n]
Expresiones de corchetes POSIX
[:alpha:]
[:dogit:]
[:alnum:]
[:lower:]
[:upper:]
Expresiones de corchetes POSIX
[:punct:]
[:space:]
[:blank:]
[:print:]
[:graph:]
[:cntrl:]
Apuntes sección 3: Conjunto de caracteres, en los archivos anexos
* cero o más veces del elemento precedente
+ una o más veces del elemento precedente
? cero o una vez (opcional) del elemento precedente
{} lo que está antes de las llaves debe aparecer exactamente esa cantidad de veces
{min,max} --> lo que está antes tiene que aparecer entre esas cantidades (ambas inclusive)
{min,} definimos un mínimo, no un máximo, tiene que aparecer desde esa cantidad de veces.
Las expresiones regulares son “codiciosas” (greedy) porque siempre van a seleccionar la cadena más grande.
<p>(.*)<\/p>
<p>en el agua clara, que brota en la fuente</p> <p> un lindo pescado, sale de repente</p>
Para hacer a las expresiones regulares ya no sean “codiciosas”, las podemos hacer perezosas:
Codicioso Perezoso
(.*) (.*?)
(.+) (.+?)
(?) (??)
{min.max} {min,max}?
Utilizar las repeticiones en forma eficiente
/\w+s/
El metacaracter “+” es más eficiente que “*”
Las llaves {} son más eficientes que “+” y “*”
Delimitar las búsquedas con delimitadores (^$) es más eficiente
Apuntes sección 4: Expresiones de repetición
Por medio de los paréntesis “( )” podemos agrupar expresiones.
Por medio de los paréntesis podemos:
Aplicar operadores de repetición a grupos.
Hacer las expresiones más legibles.
“Capturar” un grupo para empatar o reemplazar.
No podemos agrupar dentro de un conjunto de caracteres [()]
Por medio del metacaracter “|” (pipe o línea vertical) podemos alternar expresiones.
Empata expresiones de izquierda a derecha.
Tiene precedencia las expresiones de la izquierda.
Por lo general alternamos expresiones dentro de paréntesis.
En este caso son expresiones, no caracteres.
Las expresiones regulares son “codiciosas” (greddy)
También son “ansiosas” (eager):
(agua|aguacate)
Es mejor escribir:
agua(cate)?
Repeticiones:
([A-Z]|[a-z]|[0-9]){3}
Anidaciones:
(jugo (manzana|pera)|agua (naranja|fresa|sandia)|agua(cate)?)
Apuntes sección 5: Agrupar y alternar expresiones, en el archivo anexo.
Los metacaracteres con los cuales podemos delimitar una expresión regular son:
^ Inicio de la expresión
$ Fin de la expresión
\A Inicio de la expresión, nunca fin de la línea
\Z Fin de la expresión, nunca fin de la líne
El modo de línea sencilla está activo por omisión.
Puede activar el modo de línea múltiple por medio del modificador “m”.
^ y $ no empatan con el fin de línea.
Muchas herramientas UNIX solo manejan el modo de línea sencilla.
\A y \Z no funcionan en JavaScript
\b Límites de las palabras (inicio y fin de la palabra)
\B No es el fin ni el inicio de la palabra
Versiones antiguas de UNIX no soportan estos metacaracteres
\b\w+\b
Apuntes a la sección 6: Delimitadores de expresiones, en los archivos anexos.
Las expresiones agrupadas (entre paréntesis) son “capturadas”.
/a(c{2}io)n/
Recuerda el contenido y podemos “referenciarlo”.
No recuerda la expresión.
Hacemos una “referencia” iniciando como \1 al \9
Podemos utilizar la referencia dentro de la expresión o después de ella.
No se pueden utilizar dentro de las clases de caracteres, corchetes [ ].
Hay que tener cuidado en hacer referencia a expresiones “opcionales”.
Aquí hacemos un grupo y dentro viene un elemento opcional (?).
(A?)B\1C
Aquí hacemos un grupo que es opcional:
(A)?B\1
Utilizar referencias en la acción “Buscar y reemplazar”
Utilizar Sublime 3
(\w+), (\w+)
$2 $1
Para especificar que no se capture un grupo en una expresión regular se utiliza:
?:
Puede servir para optimizar las búsquedas.
Para guardar referencias cuando estas son limitadas.
Expresiones de grupo de no-captura
(rojo) es (verde) no \1
(rojo) es (verde) no \2
(?:rojo) es (verde) no \1
Apuntes sección 7: Capturar y hacer referencia a los grupos de RegEx en los recursos anexos
Las aserciones son “pruebas” para encontrar cadenas, pero que no se consideran dentro de la selección.
Tienen “longitud-cero”.
Aserciones básicas son los metacaracteres “^” y “$” que son “longitud-cero”.
Como secuencias de escape podemos definir otras aserciones simples:
\b y \B delimitador de palabra y su negativo
\a y \A inicio de palabra y su negativo
\z y \Z final de la palabra y su negativo
Por medio de una aserción negativa indicamos “que no termine en...”
/(?!regex)/
/aguacate(?!,)/
/video(?! curso)/
/video(?!.*curso)/
Aserciones negativas “lookaround”
/\bcaballo\b(?! negro)/
/\bcaballo\b(?= negro)
Podemos seleccionar cadenas que contengan “antes” alguna subcadena, o en su defecto, que no la tengan como condición:
/(?<=regex)/ aserción positiva
/(?<!regex)/ aserción negativa
Aserciones negativas:
/(?<!base)ball/
/ball(?<!base)
Apuntes sección 8: Aserciones lookarround en los archivos anexos
Validar un año
/\d{4}/ 0000-9999
/(19|20)\d\d/ 1900-2099
/(19[5-9]\d|20[0-4]\d)/ 1950-2049
Validar nombres:
/\w+/
/^\w+$/
/^[A-Za-z]+$/
/^[A-Za-z.’\- ]+$/
/^([A-Za-z.’\- ]+) ([A-Za-z.’\-]+)$/
/^([A-Za-z.’\- ]+) ([A-Za-z.’\-]+ )?([A-Za-z.’\-]+)$/
Igualar códigos postales
^[0-9]{5}$
^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$
Igualar correos electrónicos
^\w+@\w+\.\w{3}$
^\w+@[\w.]+\.\w{2,3}$
^\w+@[\w.]+\.[A-Za-z]{2,3}$
^[\w.%+\-]+@[\w.\-]+\.[A-Za-z]{2,3}$
^[\w.%+\-]+@[\w.\-]+\.[A-Za-z]{2,7}$
Igualar url’s:
^(http|https):\/\/[\w.\-]+(\.[\w\-]+)+.*$
^(http|https):\/\/[\w.\-]+(\.[\w\-]+)+[\w\-.,@?^~=%&:;/\\+#]+$
Igualar decimales y monedas
^\d+\.\d+$
^$(\d*\.\d+)$
^(\$|\u00A3|\u00A5|\uFFE5)(\d*\.\d+)$
^(\$|€|\u00A3|\u00A5|\uFFE5)(\d*\.\d{0,2})$
Igualar direcciones IP
^\d+\.\d+\d+\.\d+$
^\d{1,3}\.\d{1,3}\d{1,3}\.\d{1,3}
Validar fechas:
^(19[5-9][0-9]|20[0-4][0-9])[-/](0?[1-9]|1[0-2])[-/](0?[1-9]|[12][0-9]|3[01])$
Acepta:
1950-12-31, 2016-02-31, 2016-06-09, 2016/9/1
No acepta:
9999-12-31
En esta clase encontrarás el documento PDF de los apuntes de la sección.
Expresiones regulares para HTML5
Por medio del atributo “pattern” podemos utilizar las expresiones regulares.
Sólo funciona en la etiqueta <input>
password
search
tel
text
url
Crear expresiones regulares en JavaScript:
var re = /ab+c/;
var re = new RegExp("ab+c");
Métodos que utilizan expresiones regulares
exec: Un método RegExp que ejecuta una búsqueda por una coincidencia en una cadena. Devuelve un array de información.
test: Un método RegExp que verifica una coincidencia en una cadena. Devuelve true o false.
match: Un método String que ejecuta una búsqueda por una coincidencia en una cadena. Devuelve un array de información o null si no existe coincidencia alguna.
PHP maneja los PCRE (Perl Compatible Regular Expressions) y las expresiones regulares POSIX.
Se recomienda utilizar PCRE y no utilizar POSIX.
Expresiones regulares para PHP (PCRE)
Se recomienda utilizar PCRE 8.10 o posterior para PHP 5.6 y 7.0.
preg_filter — Realiza una búsqueda y sustitución de una expresión regular
preg_grep — Devuelve entradas de arreglo que coinciden con el regex
preg_last_error — Devuelve el código de error de la última ejecución de expresión regular de PCRE
preg_match_all — Realiza una comparación global de una expresión regular
preg_match — Realiza una comparación con una expresión regular
preg_quote — Escapar caracteres en una expresión regular
Por medio de las expresiones regulares podemos validar que una clave de acceso tenga una letra mayúscula, una minúscula, un número, un símbolo y de cierta longitud.
Apuntes de la sección en los archivos anexos.
Las expresiones regulares son fundamentales para el desarrollo de aplicaciones en cualquier plataforma. En el desarrollo web, en particular, nos serán de enorme utilidad para la validación, remplazo y búsqueda de información. En este curso iniciaremos el estudio de las expresiones regulares desde "cero", es decir, analizaremos cada elemento poco a poco, hasta tener un conocimiento claro de las mismas.
En la segunda parte del curso desarrollaremos, tomamos como punto de partida lo aprendido, diez expresiones regulares fundamentales para el desarrollo web, así como analizaremos algunas expresiones desarrolladas por terceros.
En la tercera parte del curso tomaremos las expresiones regulares vistas en la sección anterior y las aplicaremos en los principales lenguajes de desarrollo web: HTML5, JavaScript y PHP.
Este no es un curso de programación. Necesitas tener una base mínima en el desarrollo web, pero no necesitas ser un experto, en este curso estudiaremos las expresiones regulares desde lo más básico.
Este curso está dirigido a:
Desarrolladores web que deseen construir aplicaciones con la validación de datos con HTML5, JavaScript y PHP por medio de las expresiones regulares.