Expressões regulares em C++ com exemplos: guia completo para iniciantes
Expressões regulares (regex) são uma ferramenta poderosa para buscar, validar e substituir texto com base em um padrão. Em C++, o trabalho com expressões regulares é implementado através da biblioteca <regex>, que foi introduzida no padrão C++11. Neste artigo, vamos explorar os fundamentos do uso de regex em C++ com exemplos práticos, compreensíveis até para iniciantes.
O que são expressões regulares e para que servem?
Uma expressão regular é uma sequência de caracteres que define um padrão para busca em texto. Por exemplo, o padrão \\d{3}-\\d{2}-\\d{2} descreve o formato de um número de CPF: três dígitos, um traço, dois dígitos, um traço, dois dígitos.
As principais tarefas resolvidas por expressões regulares em C++ são:
- Validação de entrada (email, telefone, data)
- Extração de dados de texto
- Busca e substituição de substrings
- Divisão de strings por separadores complexos
A biblioteca <regex> fornece três algoritmos principais:
std::regex_match— correspondência completa da string com o padrãostd::regex_search— busca por correspondência na stringstd::regex_replace— substituição de correspondências com base no padrão
Sintaxe básica de expressões regulares em C++
Antes de escrever código, vamos revisar os elementos básicos da sintaxe regex que serão úteis nos exemplos:
| Símbolo | Significado | Exemplo |
|---|---|---|
. | Qualquer caractere (exceto quebra de linha) | c.t — cat, cot, cut |
\\d | Dígito (0-9) | \\d\\d — 23, 45, 99 |
\\w | Letra, dígito ou sublinhado | \\w+ — palavra |
\\s | Caractere de espaço em branco | \\s+ — um ou mais espaços |
* | 0 ou mais repetições | ab*c — ac, abc, abbc |
+ | 1 ou mais repetições | ab+c — abc, abbc (não ac) |
? | 0 ou 1 repetição | colou?r — color, colour |
{n} | Exatamente n repetições | \\d{3} — 123, 456 |
[abc] | Qualquer caractere do conjunto | [aeiou] — vogal |
() | Grupo de captura | (\\d{2})-(\\d{2}) |
Exemplo 1: Validação de email com regex_match
Vamos começar com algo simples — verificar se uma string corresponde ao formato de email. Usaremos std::regex_match, que exige correspondência completa.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Padrão simples para email: // [\\w.]+ — um ou mais caracteres (letras, dígitos, ponto, sublinhado) // @ — símbolo arroba // [\\w.]+ — nome de domínio // \\.[a-z]{2,} — ponto e domínio de topo (pelo menos 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; } // Exemplo com email invá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 da execução:
Email válidoEmail inválidoObserve que