Expressões Regulares em C# com Exemplos: Na Prática
Expressões regulares (regex) são uma ferramenta poderosa para buscar, validar e substituir texto com base em padrões. Em C# (.NET), o trabalho com elas é feito através da classe System.Text.RegularExpressions.Regex. Neste artigo, exploraremos os principais recursos com exemplos reais: desde a simples validação de email até a extração de dados de HTML. Todos os exemplos estão prontos para copiar e usar em seus projetos.
Fundamentos do Trabalho com Regex em C#
A classe Regex fornece três métodos principais:
- IsMatch — verifica se a string corresponde ao padrão;
- Match — encontra a primeira correspondência;
- Matches — encontra todas as correspondências.
Um exemplo simples — verificar se a string contém dígitos:
using System;using System.Text.RegularExpressions;
public class RegexExample{ public static void Main() { string text = "Meu número: 12345"; string pattern = @"\\d+"; // um ou mais dígitos
bool hasDigits = Regex.IsMatch(text, pattern); Console.WriteLine(hasDigits); // True }}Observe o @ antes da string — é um literal de string verbatim, que desativa o escape da barra invertida. Sem ele, seria necessário escrever "\\\\d+".
Validação de Email e Número de Telefone
Validação de Email
A validação de email é uma tarefa clássica. Um padrão simples, mas funcional:
public static bool IsValidEmail(string email){ string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; return Regex.IsMatch(email, pattern);}
// UsoConsole.WriteLine(IsValidEmail("user@example.com")); // TrueConsole.WriteLine(IsValidEmail("user@.com")); // FalseVamos analisar o padrão:
^— início da string;[a-zA-Z0-9._%+-]+— parte local (letras, dígitos e caracteres especiais);@— símbolo "arroba";[a-zA-Z0-9.-]+— domínio;\\.— ponto (escapado);[a-zA-Z]{2,}— zona do domínio (pelo menos 2 letras);$— fim da string.
Validação de Número de Telefone
Exemplo para o formato russo (+7 XXX XXX-XX-XX):
public static bool IsValidRussianPhone(string phone){ string pattern = @"^\\+7\\d{3}\\d{3}-\\d{2}-\\d{2}$"; // Ou uma versão mais flexível: // @"^\\+7[\\s-]?\\d{3}[\\s-]?\\d{3}[\\s-]?\\d{2}[\\s-]?\\d{2}$" return Regex.IsMatch(phone, pattern);}Extração de Dados de Texto com Grupos de Captura
Grupos de captura (parênteses ()) permitem extrair partes da correspondência. Por exemplo, vamos extrair todos os emails de um texto:
string text = "Contatos: support@site.com, admin@test.org, info@company.net";string pattern = @"([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\.([a-zA-Z]{2,})";
MatchCollection matches = Regex.Matches(text, pattern);foreach (Match match in matches){ Console.WriteLine($"Email completo: {match.Value}"); Console.WriteLine($"Parte local: {match.Groups[1].Value}"); Console.WriteLine($"Domínio: {match.Groups[2].Value}"); Console.WriteLine($"Zona: {match.Groups[3].Value}"); Console.WriteLine("---");}Resultado:
Email completo: support@site.comParte local: supportDomínio: siteZona: com---Os grupos são numerados a partir de 1 (o grupo 0 é a correspondência completa). É possível nomeá-los:
string pattern = @"(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+)\\.(?<tld>[a-zA-Z]{2,})";// Acesso: match.Groups["user"].ValueExtração de Links de HTML
string html = @"<a href='https://example.com'>Examp