Introducción a las Expresiones Regulares
Las expresiones regulares, comúnmente conocidas como Regex, son secuencias de caracteres que conforman un patrón de búsqueda. Su función principal es facilitar la identificación, validación y manipulación de fragmentos de texto dentro de cadenas más complejas. Mediante el uso de una sintaxis estandarizada, permiten resolver problemas como la validación de formatos (correos electrónicos, fechas), la extracción de datos específicos o la sustitución masiva de caracteres.
Implementación según el Lenguaje
La mayoría de los lenugajes de programación modernos integran motores de Regex de forma nativa o mediante librerías estándar:
- Python: Utiliza el módulo
re(métodos comosearch,match,findall). - Java: Emplea el paquete
java.util.regexcon las clasesPatternyMatcher. - C#: Se basa en el espacio de nombres
System.Text.RegularExpressionsa través de la claseRegex. - JavaScript: Soporta Regex de forma nativa mediante el objeto
RegExpo literales encerrados en barras laterales (/patrón/).
Componentes de la Sintaxis
Caracteres de Escape (No imprimibles)
Estos caracteres representan elementos de formato o control dentro de un texto:
| Símbolo | Descripción |
|---|---|
\n |
Salto de línea. |
\r |
Retorno de carro. |
\t |
Tabulación horizontal. |
\s |
Cualquier carácter de espacio en blanco (espacio, tabulador, salto de línea). |
\S |
Cualquier carácter que no sea un espacio en blanco. |
Metacaracteres Especiales
Son símbolos con un significado reservado que definen el comportamiento de la búsqueda:
| Carácter | Función |
|---|---|
. |
Coincide con cualquier carácter individual excepto saltos de línea. |
^ |
Indica el inicio de una cadena o línea. |
$ |
Indica el final de una cadena o línea. |
* |
Cuantificador: busca el elemento anterior 0 o más veces. |
+ |
Cuantificador: busca el elemento anterior 1 o más veces. |
? |
Hace que el elemento anterior sea opcional (0 o 1 ocurrencia). |
[ ] |
Define un conjunto o rango de caracteres permitido (ej. [a-z]). |
| |
Operador lógico de alternancia (OR). |
\ |
Escapa un carácter especial para buscarlo literalmente. |
Cuantificadores y Control de Repetición
Los cuantificadores determinan la frecuencia con la que un componente debe aparecer para que exista una coincidencia:
{n}: Eaxctamente n veces.{n,}: Al menos n veces.{n,m}: Entre n y m veces, inclusive.
Por ejemplo, si deseamos validar un código de producto que empieza con la palabra "REF" seguida de 3 a 5 dígitos:
/REF-\d{3,5}/
Comportamiento Codicioso (Greedy) vs. Perezoso (Lazy)
Por defecto, cuantificadores como * y + son "codiciosos", lo que significa que intentarán capturar la mayor cantidad de texto posible. Al añadir un signo de inetrrogación ? después del cuantificador, el motor se vuelve "perezoso", capturando la coincidencia más corta posible.
Ejemplo en HTML:
Texto: <b>Texto 1</b> y <b>Texto 2</b>
Codicioso (/<b>.*</b>/): Captura desde el primer <b> hasta el último </b>.
Perezoso (/<b>.*?</b>/): Captura cada etiqueta por separado.
Anclajes y Límites de Palabra
Los anclajes no coinciden con caracteres, sino con posiciones:
\b: Representa un límite de palabra (donde comienza o termina una palabra).\B: Representa una posición que no es un límite de palabra.
/\bauto/ # Coincide con "automóvil", pero no con "desauto"
/auto\b/ # Coincide con "plauto", pero no con "autor"
Grupos de Captura y Referencias Retroactivas
Encerrar parte de una expresión entre paréntesis ( ) crea un grupo de captura. Esto permite aplicar cuantificadores a todo el grupo o extraer partes específicas de la cadena buscada.
Las referencias retroactivas (como \1) permiten buscar repeticiones del texto capturado por un grupo previo. Útil para encontrar palabras duplicadas consecutivas:
/\b([a-zA-Z]+) \1\b/
Colección de Patrones Comunes
Validación de Números
- Solo dígitos:
^[0-9]*$ - Enteros (incluyendo negativos):
^-?\d+$ - Decimales con dos posiciones:
^[0-9]+(\.[0-9]{2})?$
Validación de Cadenas y Formatos
- Correo Electrónico:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - Dirección IP (IPv4):
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$ - Fecha (AAAA-MM-DD):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ - URL:
^https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?$
Manipulación de Texto
- Eliminar espacios al inicio y final:
^\s+|\s+$ - Detectar etiquetas HTML:
</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?> - Caracteres Unicode (Chino/Japonés/Coreano):
[\u4e00-\u9fa5]