Expresiones regulares

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])$