Expresiones regulares en C# con ejemplos: en la práctica
Las expresiones regulares (regex) son una herramienta poderosa para buscar, validar y reemplazar texto según un patrón. En C# (.NET), el trabajo con ellas se implementa a través de la clase System.Text.RegularExpressions.Regex. En este artículo, analizaremos las principales capacidades con ejemplos reales: desde la validación simple de email hasta la extracción de datos de HTML. Todos los ejemplos están listos para copiar y usar en tus proyectos.
Fundamentos del trabajo con Regex en C#
La clase Regex proporciona tres métodos clave:
- IsMatch — verifica si la cadena coincide con el patrón;
- Match — encuentra la primera coincidencia;
- Matches — encuentra todas las coincidencias.
Un ejemplo simple: verificar si una cadena contiene dígitos:
using System;using System.Text.RegularExpressions;
public class RegexExample{ public static void Main() { string text = "Mi número: 12345"; string pattern = @"\\d+"; // uno o más dígitos
bool hasDigits = Regex.IsMatch(text, pattern); Console.WriteLine(hasDigits); // True }}Observa el @ antes de la cadena: es un literal de cadena textual (verbatim string literal) que desactiva el escape de la barra invertida. Sin él, tendrías que escribir "\\\\d+".
Validación de email y número de teléfono
Validación de email
La validación de email es una tarea clásica. Un patrón simple pero 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")); // FalseAnalicemos el patrón:
^— inicio de la cadena;[a-zA-Z0-9._%+-]+— parte local (letras, dígitos y caracteres especiales);@— símbolo "arroba";[a-zA-Z0-9.-]+— dominio;\\.— punto (escapado);[a-zA-Z]{2,}— zona del dominio (al menos 2 letras);$— final de la cadena.
Validación de número de teléfono
Ejemplo para el formato ruso (+7 XXX XXX-XX-XX):
public static bool IsValidRussianPhone(string phone){ string pattern = @"^\\+7\\d{3}\\d{3}-\\d{2}-\\d{2}$"; // O una variante más flexible: // @"^\\+7[\\s-]?\\d{3}[\\s-]?\\d{3}[\\s-]?\\d{2}[\\s-]?\\d{2}$" return Regex.IsMatch(phone, pattern);}Extracción de datos de texto usando grupos de captura
Los grupos de captura (paréntesis ()) permiten extraer partes de una coincidencia. Por ejemplo, extraigamos todos los emails de un texto:
string text = "Contactos: 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($"Dominio: {match.Groups[2].Value}"); Console.WriteLine($"Zona: {match.Groups[3].Value}"); Console.WriteLine("---");}Resultado:
Email completo: support@site.comParte local: supportDominio: siteZona: com---Los grupos se numeran desde 1 (el grupo 0 es toda la coincidencia). Se les pueden asignar nombres:
string pattern = @"(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+)\\.(?<tld>[a-zA-Z]{2,})";// Acceso: match.Groups["user"].ValueExtracción de enlaces de HTML
string html = @"<a href='https://example.com'>Examp