Expressões Regulares em C++: Uma Ferramenta Poderosa para Trabalhar com Strings
Expressões regulares (regex) são uma linguagem formal para busca e manipulação de substrings em texto baseada em padrões. Em C++, o suporte para expressões regulares foi introduzido no padrão C++11 e é implementado na biblioteca <regex>. É uma ferramenta indispensável para validação de dados, parsing de logs, busca de padrões e substituição de texto.
Neste artigo, vamos analisar as principais funções da biblioteca regex, aprender a criar padrões e examinar exemplos práticos com código.
1. Principais Tipos e Funções da Biblioteca <regex>
Para trabalhar com expressões regulares em C++, são usadas três classes principais:
std::regex— representa a própria expressão regular (padrão).std::smatch— contêiner para armazenar resultados de busca (para strings do tipostd::string).std::cmatch— análogo para C-strings (const char*).
Funções-chave para aplicar regex:
std::regex_match()— verifica se toda a string corresponde ao padrão.std::regex_search()— busca a primeira correspondência com o padrão na string.std::regex_replace()— substitui todas as correspondências pelo texto especificado.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Meu 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; }
// Extraindo a correspondência std::smatch match; if (std::regex_search(text, match, pattern)) { std::cout << "Número encontrado: " << match[0] << std::endl; }
return 0;}2. Sintaxe das Expressões Regulares: Metacaracteres e Quantificadores
Os padrões regex em C++ usam uma sintaxe semelhante ao ECMAScript (padrão). Aqui estão os elementos principais:
- Ponto (.) — qualquer caractere único, exceto quebra de linha.
- Asterisco (*) — 0 ou mais repetições do caractere anterior.
- Mais (+) — 1 ou mais repetições.
- Ponto de interrogação (?) — 0 ou 1 repetição (torna o caractere opcional).
- Colchetes ([]) — classe de caracteres (exemplo:
[0-9]— qualquer dígito). - Parênteses (()) — agrupamento e captura de substring.
- Barra vertical (|) — OU lógico.
- Símbolo ^ — início da string.
- Símbolo $ — fim da string.
Exemplos de quantificadores:
\\d{3}— exatamente 3 dígitos.\\w{2,4}— de 2 a 4 caracteres alfanuméricos.[A-Za-z]+— uma ou mais letras latinas.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Padrão simples para email std::regex email_pattern(R"([\\w.+-]+@[\\w-]+\\.[\\w.]+)");
if (std::regex_match(email, email_pattern)) { std::cout << "Email válido." << std::endl; } else { std::cout << "Email inválido." << std::endl; }
// Verificação de número de telefone 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 << "Telefone válido." << std::endl; }
return 0;}3. Extração de Dados Usando Grupos de Captura
Grupos de captura