Expressões regulares em C#: guia completo para iniciantes
Expressões regulares (regular expressions, regex) são uma ferramenta poderosa para buscar, substituir e validar strings com base em um padrão definido. Em C# (.NET), o trabalho com expressões regulares é implementado através do namespace System.Text.RegularExpressions. Este artigo ajudará você a dominar os fundamentos: desde a criação dos padrões mais simples até o uso de todos os recursos da classe Regex.
1. Fundamentos do trabalho com Regex em C#
Para começar, inclua o namespace:
using System.Text.RegularExpressions;A classe Regex fornece métodos estáticos e de instância. A maneira mais simples de verificar se uma string contém uma substring que corresponde a um padrão é o método IsMatch:
string text = "Olá, meu email: test@example.com";string pattern = @"\\w+@\\w+\\.\\w+"; // padrão simples de email
bool hasEmail = Regex.IsMatch(text, pattern);Console.WriteLine(hasEmail); // TrueAnálise do padrão:
\\w+— uma ou mais letras, dígitos ou sublinhados@— o caractere "arroba"\\.— ponto escapado (sem escape, o ponto significa "qualquer caractere")
Para chamadas repetidas, é melhor criar um objeto Regex para evitar a recompilação do padrão:
Regex emailRegex = new Regex(@"\\w+@\\w+\\.\\w+");Console.WriteLine(emailRegex.IsMatch("admin@site.ru")); // True2. Buscando todas as correspondências: Match e MatchCollection
O método Match retorna a primeira correspondência, enquanto Matches retorna todas as correspondências em uma coleção MatchCollection. Cada objeto Match contém informações sobre a substring encontrada, sua posição e comprimento.
Exemplo: extraindo todos os números de uma string
string data = "Em 2023 houve 15 eventos, em 2024 — já 23.";string numberPattern = @"\\d+"; // um ou mais dígitos
MatchCollection matches = Regex.Matches(data, numberPattern);
foreach (Match match in matches){ Console.WriteLine($"Encontrado: {match.Value} na posição {match.Index}");}// Saída:// Encontrado: 2023 na posição 3// Encontrado: 15 na posição 21// Encontrado: 2024 na posição 35// Encontrado: 23 na posição 48Trabalhando com grupos (Group). Grupos permitem extrair partes de uma correspondência. Por exemplo, ao buscar uma data no formato "dd.mm.aaaa", é possível obter separadamente o dia, o mês e o ano:
string input = "Hoje é 25.12.2024";string datePattern = @"(\\d{2})\\.(\\d{2})\\.(\\d{4})";
Match match = Regex.Match(input, datePattern);if (match.Success){ Console.WriteLine($"Dia: {match.Groups[1].Value}"); // 25 Console.WriteLine($"Mês: {match.Groups[2].Value}"); // 12 Console.WriteLine($"Ano: {match.Groups[3].Value}"); // 2024}Os grupos são numerados a partir de 1 (o grupo 0 é a correspondência inteira). Grupos nomeados são mais fáceis de ler:
string namedPattern = @"(?<day>\\d{2})\\.(?<month>\\d{2})\\.(?<year>\\d{4})";match = Regex.Match(input, namedPattern);Console.WriteLine(match.Groups["day"].Value); // 253. Recursos avançados: substituições e opções
Substituição de texto com Regex.Replace. Permite não apenas remover ou substituir uma substring, mas também usar grupos na string de substituição:
string phone = "+7 (123) 456-78-90";// Remove tudo, exceto dígitosstring clean = Regex.Replace(phone, @"[^\\d]", "");Console.WriteLine(clean); // 71234567890
// Muda o formato: (123) 456-78-90 → 123-456-7890string formatted = Regex.Replace(phone, @"\\((\\d{3})\\)\\s*(\\d{3})-(\\d{2})-(\\d{2})", "$1-$2-$3$4");Console.WriteLine(formatted); // 123-456-7890Opções importantes (RegexOptions):