WikiPlus

Aprender expresiones regulares desde cero — guía básica de regex

Las expresiones regulares parecen un lenguaje secreto de caracteres extraños, pero tienen una lógica interna coherente que se aprende rápidamente una vez que entiendes el sistema. Esta guía cubre los conceptos fundamentales de regex desde cero, con ejemplos que puedes probar en tiempo real con WikiPlus Probador de Regex. Al final de la lectura, serás capaz de escribir patrones para las tareas de procesamiento de texto más habituales.

Metacaracteres fundamentales

Los metacaracteres son los caracteres especiales que tienen un significado específico en regex. El punto . coincide con cualquier carácter excepto salto de línea. El asterisco * significa «cero o más repeticiones del elemento anterior». El signo + significa «una o más repeticiones». El signo ? significa «cero o una repetición (elemento opcional)». Las llaves {} permiten especificar el número exacto: {3} exactamente 3, {2,5} entre 2 y 5, {3,} al menos 3. El circunflejo ^ al inicio del patrón significa «inicio del string». El signo $ al final significa «fin del string». La barra invertida \ escapa el siguiente carácter para tratarlo literalmente: \. coincide con un punto literal, \* con un asterisco literal.

Clases de caracteres y atajos

Las clases de caracteres se definen entre corchetes []: [abc] coincide con a, b o c. [a-z] coincide con cualquier letra minúscula. [A-Z] coincide con cualquier letra mayúscula. [0-9] coincide con cualquier dígito. [^abc] coincide con cualquier carácter que NO sea a, b, o c. Los atajos predefinidos más usados son \d (cualquier dígito, equivale a [0-9]), \D (cualquier no-dígito), \w (cualquier carácter alfanumérico o guión bajo, equivale a [a-zA-Z0-9_]), \W (cualquier no-alfanumérico), \s (cualquier espacio en blanco, tab, salto de línea), \S (cualquier no-espacio). El punto . coincide con cualquier carácter excepto salto de línea.

Grupos de captura y alternativas

Los paréntesis () crean grupos de captura: el texto coincidente dentro del grupo queda accesible por separado, numerado del 1 en adelante de izquierda a derecha. Los grupos no capturantes (?:...) agrupan sin capturar. Los grupos nombrados (?<nombre>...) asignan un nombre al grupo para referenciarlo por nombre en lugar de número. La alternativa | funciona como OR: gato|perro coincide con 'gato' o 'perro'. Los lookahead (?=...) y lookbehind (?<=...) son aserciones de posición: comprueban que algo existe delante o detrás sin incluirlo en la coincidencia. Por ejemplo, \d+(?= EUR) coincide con dígitos seguidos de ' EUR' sin incluir el ' EUR' en el resultado.

Ejemplos prácticos de regex habituales

Estos son algunos patrones regex prácticos que puedes probar directamente en WikiPlus. Validación de email básica: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}. Número de teléfono español: (\+34|0034)?[ -]?[6-9]\d{8}. URL básica: https?://[\w.-]+(/[\w./?=&%#-]*)?. Código postal español: \d{5}. Fecha en formato DD/MM/YYYY: (0[1-9]|[12]\d|3[01])/(0[1-9]|1[0-2])/\d{4}. Slug de URL: [a-z0-9]+(-[a-z0-9]+)*. Cada uno de estos patrones puede refinarse según los casos edge específicos de tu aplicación.

Preguntas frecuentes

¿Los regex son iguales en JavaScript, Python y PHP?
Los conceptos fundamentales (metacaracteres, clases, grupos, cuantificadores) son equivalentes en los motores más habituales. Las diferencias principales están en algunas extensiones de sintaxis: los backreferences condicionales existen en PCRE (PHP, Python) pero no en JavaScript; la sintaxis de los grupos nombrados difiere ligeramente; el comportamiento de algunos lookahead/lookbehind de longitud variable varía. Para la mayoría de patrones habituales (validación de email, extracción de datos, búsqueda y reemplazo), los patrones son portables entre lenguajes con mínimas adaptaciones.
¿Qué significa cuando el regex es 'demasiado codicioso' (greedy)?
Por defecto, los cuantificadores * + {} son greedy (codiciosos): intentan coincidir con la secuencia más larga posible. Por ejemplo, <.+> aplicado a '<a>texto</a>' coincidirá con '<a>texto</a>' completo, no con '<a>' solo. Para hacer el cuantificador lazy (perezoso, coincide con lo mínimo posible), añade ? después: <.+?> coincidirá solo con '<a>'.
¿Cómo escapo caracteres especiales en una regex para buscarlos literalmente?
Para buscar un carácter que normalmente es un metacarácter (punto, asterisco, paréntesis, corchetes, llaves, signo de dólar, circunflejo, barra vertical, barra invertida, signo de más, signo de interrogación), precédelo con una barra invertida: \. para buscar un punto literal, \( para un paréntesis literal, \$ para un dólar literal. En programación, recuerda que la barra invertida en un string de código también necesita ser escapada, resultando en barras dobles: '\\d' en el string de código produce el patrón \d.