Expressões regulares em C++: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 tipo std::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

Blogs

Book Recommendations