Las expresiones regulares (ER), también llamadas patrones, son una forma de describir cadenas de caracteres sin enumerar la totalidad de sus elementos. Se utilizan muy frecuentemente en programación y diseño Web y nos permiten realizar búsquedas o sustituciones de gran complejidad.
En el área de la programación, las expresiones regulares son un método muy eficaz para realizar búsquedas dentro de cadenas de caracteres y también para validar formatos específicos en una cadena dada (como fechas o identificadores).
Para poder utilizar estos patrones al programar es necesario tener acceso a un motor de búsqueda con capacidad de utilizarlas. Estos motores pueden ser de dos tipos:
- Motores para el usuario final: programas que permiten realizar búsquedas sobre el contenido de un archivo o de un texto cualquiera. Es necesario aprender a redactar las expresiones regulares adecuadas para poder sacarles el rendimiento deseado. Algunos de los más frecuentes son: grep, sed, PowerGrep, RegexBuddy, EditPad Pro…
- Motores para el programador: permiten automatizar el proceso de búsqueda de modo que sea posible utilizarlo múltiples veces para un propósito específico. Algunas de las herramientas de programación que soportan las ER son: AWK, Java, JavaScript, Perl, PCRE, PHP, Python, Net Framework…
Aunque por lo general las expresiones regulares utilizan un lenguaje común en todas las herramientas y su sintaxis es relativamente uniforme, cada lenguaje usa su propio dialecto. Por este motivo, el contenido de esta entrada en el blog del curso debería servir simplemente de guía o introducción a los patrones de búsqueda y tener siempre presente estas posibles diferencias que podamos encontrar.
Las expresiones regulares se construyen como las expresiones aritméticas, usando operadores para combinar expresiones más pequeñas y están formadas por un conjunto de caracteres (un grupo de letras, números o signos) o por meta-caracteres, que representan otros caracteres y permiten una búsqueda contextual.
Los meta-caracteres no se representan a ellos mismos, sino que son interpretados de una forma especial, ya que tienen un significado propio. Los más utilizados son: . * ? + [ ] ( ) { } ^ $ | \
Significado de los caracteres especiales más utilizados:
^ Principio de entrada o línea.
$ Fin de entrada o línea.
* El carácter anterior ninguna o más veces.
+ El carácter anterior una o más veces.
? El carácter anterior una vez como máximo (es decir, una o ninguna, es opcional).
. Cualquier carácter individual, salvo el de salto de línea.
x|y x o y (una de varias opciones).
{n} Exactamente n apariciones del carácter anterior.
{n,m} Como mínimo n y como máximo m apariciones del carácter anterior.
[abc] Cualquiera de los caracteres entre corchetes (o un rango de caracteres [a-f]).
[^abc] Cualquier carácter que no esté entre corchetes.
\b Límite de palabra (como un espacio o un retorno de carro).
\B Cualquiera que no sea un límite de palabra.
\d Cualquier carácter de dígito. Es equivalente a [0-9].
\D Cualquier carácter que no sea dígito. Es equivalente a [^0-9]
\f Salto de página.
\n Salto de línea.
\r Retorno de carro.
\s Cualquier carácter individual de espacio en blanco: espacios, tabulaciones, saltos de línea o saltos de página.
\S Cualquier carácter individual que no sea un espacio en blanco.
\t Tabulación.
\v Tabulación vertical.
\a Representa una campana o «beep» que se produce al imprimir este carácter.
\e Tecla «Esc» o «Escape».
\w Cualquier carácter alfanumérico, incluido el guión bajo (o de subrayado). Es equivalente a [A-Za-z0-9_]
\W Cualquier carácter que no sea alfanumérico. Es equivalente a [^A-Za-z0-9_].
\x Para representar caracteres ASCII o ANSI si conocemos su código.
\u Para representar caracteres Unicode si conocemos su código. (No todos los motores lo soportan).
Algunos de los patrones más frecuentes a la hora de hacer validaciones de datos son:
Cualquier letra en minúsculas:
[a-z]
Número entero:
^(?:\+|-)?\d+$
Correo electrónico:
/[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/
URL:
^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\’\/\\\+&%\$#_]*)?$
IP:
^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$
Contraseña segura:
(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$
Fecha:
^\d{1,2}\/\d{1,2}\/\d{2,4}$
Hora:
^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$
Número de tarjeta de crédito:
^((67\d{2})|(4\d{3})|5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\d{2}-?\s?\d{6}-?\s?\d{5}$
Número de teléfono:
^[0-9]{2,3}-? ?[0-9]{6,7}$
Código postal:
^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$
Certificado de identificación fiscal:
^(X(-|\.)?0?\d{7}(-|\.)?[A-Z]|[A-Z](-|\.)?\d{7}(-|\.)? [0-9A-Z]|\d{8}(-|\.)?[A-Z])$