Expresiones regulares en C#: guía completa para principiantes
Las expresiones regulares (regular expressions, regex) son una herramienta poderosa para buscar, reemplazar y validar cadenas según un patrón determinado. En C# (.NET), el trabajo con expresiones regulares se implementa a través del espacio de nombres System.Text.RegularExpressions. Este artículo le ayudará a dominar los conceptos básicos: desde la creación de patrones simples hasta el uso de todas las capacidades de la clase Regex.
1. Conceptos básicos del trabajo con Regex en C#
Para empezar, incluya el espacio de nombres:
using System.Text.RegularExpressions;La clase Regex proporciona métodos estáticos y de instancia. La forma más sencilla de verificar si una cadena contiene una subcadena según un patrón es el método IsMatch:
string text = "Hola, mi correo: test@example.com";string pattern = @"\\w+@\\w+\\.\\w+"; // patrón simple de correo
bool hasEmail = Regex.IsMatch(text, pattern);Console.WriteLine(hasEmail); // TrueAnálisis del patrón:
\\w+— una o más letras, dígitos o guiones bajos@— el símbolo "arroba"\\.— punto escapado (sin escape, el punto significa "cualquier carácter")
Para llamadas repetitivas, es mejor crear un objeto Regex para evitar la recompilación del patrón:
Regex emailRegex = new Regex(@"\\w+@\\w+\\.\\w+");Console.WriteLine(emailRegex.IsMatch("admin@site.ru")); // True2. Búsqueda de todas las coincidencias: Match y MatchCollection
El método Match devuelve la primera coincidencia, mientras que Matches devuelve todas las coincidencias en una colección MatchCollection. Cada objeto Match contiene información sobre la subcadena encontrada, su posición y longitud.
Ejemplo: extraer todos los números de una cadena
string data = "En 2023 hubo 15 eventos, en 2024 — ya 23.";string numberPattern = @"\\d+"; // uno o más dígitos
MatchCollection matches = Regex.Matches(data, numberPattern);
foreach (Match match in matches){ Console.WriteLine($"Encontrado: {match.Value} en posición {match.Index}");}// Salida:// Encontrado: 2023 en posición 2// Encontrado: 15 en posición 20// Encontrado: 2024 en posición 34// Encontrado: 23 en posición 47Trabajo con grupos (Group). Los grupos permiten extraer partes de una coincidencia. Por ejemplo, al buscar una fecha en formato "dd.mm.aaaa", se puede obtener por separado el día, el mes y el año:
string input = "Hoy es 25.12.2024";string datePattern = @"(\\d{2})\\.(\\d{2})\\.(\\d{4})";
Match match = Regex.Match(input, datePattern);if (match.Success){ Console.WriteLine($"Día: {match.Groups[1].Value}"); // 25 Console.WriteLine($"Mes: {match.Groups[2].Value}"); // 12 Console.WriteLine($"Año: {match.Groups[3].Value}"); // 2024}Los grupos se numeran desde 1 (el grupo 0 es toda la coincidencia completa). Los grupos con nombre son más fáciles de leer:
string namedPattern = @"(?<day>\\d{2})\\.(?<month>\\d{2})\\.(?<year>\\d{4})";match = Regex.Match(input, namedPattern);Console.WriteLine(match.Groups["day"].Value); // 253. Capacidades avanzadas: reemplazos y opciones
Reemplazo de texto con Regex.Replace. Permite no solo eliminar o reemplazar una subcadena, sino también usar grupos en la cadena de reemplazo:
string phone = "+7 (123) 456-78-90";// Eliminamos todo excepto dígitosstring clean = Regex.Replace(phone, @"[^\\d]", "");Console.WriteLine(clean); // 71234567890
// Cambiamos el 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-7890Opciones importantes (RegexOptions):