Expresiones regulares en C++ con ejemplos: guía completa para principiantes
Las expresiones regulares (regex) son una herramienta poderosa para buscar, validar y reemplazar texto según un patrón. En C++, el trabajo con expresiones regulares se implementa a través de la biblioteca <regex>, que apareció en el estándar C++11. En este artículo, analizaremos los fundamentos del trabajo con regex en C++ con ejemplos prácticos, comprensibles incluso para principiantes.
¿Qué son las expresiones regulares y para qué sirven?
Una expresión regular es una secuencia de caracteres que define un patrón para buscar en texto. Por ejemplo, el patrón \\d{3}-\\d{2}-\\d{2} describe el formato de un número SNILS: tres dígitos, guion, dos dígitos, guion, dos dígitos.
Las principales tareas que resuelven las expresiones regulares en C++ son:
- Validación de entrada (correo electrónico, teléfono, fecha)
- Extracción de datos de texto
- Búsqueda y reemplazo de subcadenas
- División de cadenas por separadores complejos
La biblioteca <regex> proporciona tres algoritmos principales:
std::regex_match— coincidencia completa de la cadena con el patrónstd::regex_search— búsqueda de coincidencia en la cadenastd::regex_replace— reemplazo de coincidencias según el patrón
Sintaxis básica de las expresiones regulares en C++
Antes de escribir código, analicemos los elementos básicos de la sintaxis regex que serán útiles en los ejemplos:
| Símbolo | Significado | Ejemplo |
|---|---|---|
. | Cualquier carácter (excepto salto de línea) | c.t — cat, cot, cut |
\\d | Dígito (0-9) | \\d\\d — 23, 45, 99 |
\\w | Letra, dígito o guion bajo | \\w+ — palabra |
\\s | Carácter de espacio en blanco | \\s+ — uno o más espacios |
* | 0 o más repeticiones | ab*c — ac, abc, abbc |
+ | 1 o más repeticiones | ab+c — abc, abbc (no ac) |
? | 0 o 1 repetición | colou?r — color, colour |
{n} | Exactamente n repeticiones | \\d{3} — 123, 456 |
[abc] | Cualquier carácter del conjunto | [aeiou] — vocal |
() | Grupo de captura | (\\d{2})-(\\d{2}) |
Ejemplo 1: Validación de dirección de correo electrónico con regex_match
Empecemos con algo simple: verificar si una cadena coincide con el formato de un correo electrónico. Usamos std::regex_match, que requiere una coincidencia completa.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Patrón simple para email: // [\\w.]+ — uno o más caracteres (letras, dígitos, punto, guion bajo) // @ — símbolo arroba // [\\w.]+ — nombre de dominio // \\.[a-z]{2,} — punto y dominio de nivel superior (de 2 letras) std::regex pattern(R"([\\w.]+@[\\w.]+\\.\\w{2,})"); if (std::regex_match(email, pattern)) { std::cout << "Email válido" << std::endl; } else { std::cout << "Email inválido" << std::endl; } // Ejemplo con email no válido email = "user@com"; if (std::regex_match(email, pattern)) { std::cout << "Email válido" << std::endl; } else { std::cout << "Email inválido" << std::endl; } return 0;}Resultado de la ejecución:
Email válidoEmail inválidoObserva que