Expressões Regulares em C++: Uma Ferramenta Poderosa para Trabalhar com Texto
Expressões regulares (regex) são uma ferramenta extremamente poderosa para buscar, extrair e substituir fragmentos de texto com base em um padrão definido. Em C++, o suporte a expressões regulares foi introduzido no padrão C++11 e é implementado no arquivo de cabeçalho <regex>. Neste artigo, vamos detalhar como usar expressões regulares em C++ com exemplos práticos.
Componentes Principais da Biblioteca <regex>
A biblioteca <regex> inclui várias classes e funções-chave:
std::regex— classe que representa uma expressão regular compilada.std::smatch— contêiner para armazenar resultados de busca (para strings do tipostd::string).std::regex_match— verifica se toda a string corresponde ao padrão.std::regex_search— busca a primeira ocorrência do padrão na string.std::regex_replace— substitui as correspondências pelo texto especificado.
Vamos examinar cada um desses componentes com exemplos.
Exemplo 1: Verificando se uma String Corresponde a um Padrão (regex_match)
A função std::regex_match retorna true se toda a string corresponder exatamente à expressão regular. Isso é ideal para validação de dados, como verificar um email ou número de telefone.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Padrão para verificar email (simplificado) std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})"); if (std::regex_match(email, pattern)) { std::cout << "Email é válido." << std::endl; } else { std::cout << "Email é inválido." << std::endl; } // Exemplo com email inválido std::string bad_email = "user@.com"; if (std::regex_match(bad_email, pattern)) { std::cout << "Email é válido." << std::endl; } else { std::cout << "Email é inválido." << std::endl; } return 0;}Neste exemplo, usamos uma raw string R"(...)" para evitar o escape de barras invertidas. O padrão verifica se a string contém uma parte local, o símbolo @, um nome de domínio e um domínio de topo.
Exemplo 2: Buscando uma Substring no Texto (regex_search)
Se você precisa encontrar a primeira ocorrência de um padrão dentro de uma string, use std::regex_search. Os resultados são armazenados em um objeto std::smatch.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Meu número de telefone: +7 (123) 456-78-90. Ligue para mim!"; // Padrão para buscar número de telefone russo std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}[- ]?\\d{2}[- ]?\\d{2})"); std::smatch match; if (std::regex_search(text, match, phone_pattern)) { std::cout << "Número encontrado: " << match.str() << std::endl; std::cout << "Posição: " << match.position() << std::endl; } else { std::cout << "Número não encontrado." << std::endl; } return 0;}O objeto match contém não apenas a string encontrada, mas também informações sobre a posição da ocorrência. O método match.str() retorna o fragmento encontrado, e match.position() retorna o índice do início da correspondência na string original.
Exemplo 3: Substituindo Texto com regex_replace
A função std::regex_replace substitui todas as ocorrências do padrão pela string especificada. Você pode usar backreferences (referências