Expresiones regulares en C++: una poderosa herramienta para trabajar con cadenas
Las expresiones regulares (regex) son un lenguaje formal para buscar y manipular subcadenas en texto basado en patrones. En C++, el soporte para expresiones regulares apareció en el estándar C++11 y se implementa en la biblioteca <regex>. Es una herramienta indispensable para la validación de datos, el análisis de logs, la búsqueda de patrones y el reemplazo de texto.
En este artículo, analizaremos las funciones principales de la biblioteca regex, aprenderemos a crear patrones y veremos ejemplos prácticos con código.
1. Tipos y funciones principales de la biblioteca <regex>
Para trabajar con expresiones regulares en C++, se utilizan tres clases principales:
std::regex— representa la propia expresión regular (patrón).std::smatch— contenedor para almacenar los resultados de la búsqueda (para cadenas de tipostd::string).std::cmatch— análogo para cadenas C (const char*).
Funciones clave para aplicar regex:
std::regex_match()— verifica si toda la cadena coincide con el patrón.std::regex_search()— busca la primera coincidencia con el patrón en la cadena.std::regex_replace()— reemplaza todas las coincidencias con el texto especificado.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Mi número: +7-123-456-78-90"; std::regex pattern(R"(\\+7-\\d{3}-\\d{3}-\\d{2}-\\d{2})");
if (std::regex_search(text, pattern)) { std::cout << "¡Número encontrado!" << std::endl; }
// Extraemos la coincidencia std::smatch match; if (std::regex_search(text, match, pattern)) { std::cout << "Número encontrado: " << match[0] << std::endl; }
return 0;}2. Sintaxis de las expresiones regulares: metacaracteres y cuantificadores
Los patrones regex en C++ utilizan una sintaxis similar a ECMAScript (por defecto). Estos son los elementos principales:
- Punto (.) — cualquier carácter individual, excepto el salto de línea.
- Astérisco (*) — 0 o más repeticiones del carácter anterior.
- Más (+) — 1 o más repeticiones.
- Signo de interrogación (?) — 0 o 1 repetición (hace que el carácter sea opcional).
- Corchetes ([]) — clase de caracteres (por ejemplo,
[0-9]— cualquier dígito). - Paréntesis (()) — agrupación y captura de subcadenas.
- Barra vertical (|) — OR lógico.
- Símbolo ^ — inicio de la cadena.
- Símbolo $ — final de la cadena.
Ejemplos de cuantificadores:
\\d{3}— exactamente 3 dígitos.\\w{2,4}— de 2 a 4 caracteres alfanuméricos.[A-Za-z]+— una o más letras latinas.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Patrón simple para email std::regex email_pattern(R"([\\w.+-]+@[\\w-]+\\.[\\w.]+)");
if (std::regex_match(email, email_pattern)) { std::cout << "Email correcto." << std::endl; } else { std::cout << "Email incorrecto." << std::endl; }
// Verificación de número de teléfono std::string phone = "+7 (495) 123-45-67"; std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}-?\\d{2}-?\\d{2})");
if (std::regex_match(phone, phone_pattern)) { std::cout << "Teléfono correcto." << std::endl; }
return 0;}3. Extracción de datos usando grupos de captura
Los grupos de captura