Регулярные выражения в C#: мощный инструмент для работы с текстом
Регулярные выражения (regex) — это незаменимый инструмент для поиска, извлечения и замены текстовых данных по заданному шаблону. В C# (.NET) работа с регулярными выражениями реализована через мощное пространство имён System.Text.RegularExpressions и класс Regex. В этой статье мы разберём основные возможности регулярных выражений в C# на практических примерах, которые помогут вам автоматизировать обработку строк.
Основы класса Regex в C#
Главный класс для работы с регулярными выражениями в C# — это System.Text.RegularExpressions.Regex. Он предоставляет статические и экземплярные методы для выполнения операций поиска, замены и разделения строк.
Создание объекта Regex
Вы можете создать экземпляр класса Regex, передав в конструктор шаблон (паттерн) и опционально флаги:
using System.Text.RegularExpressions;
// Простое создание
Regex regex = new Regex(@"\d+");
// С флагами (например, игнорирование регистра)
Regex regexIgnoreCase = new Regex(@"hello", RegexOptions.IgnoreCase);
Важно: В C# рекомендуется использовать буквальные строки (с префиксом @) для написания шаблонов. Это позволяет не экранировать обратные слеши, делая код более читаемым.
Статические методы Regex
Для однократных операций удобнее использовать статические методы, которые не требуют создания экземпляра класса:
bool isMatch = Regex.IsMatch("Привет, мир!", @"мир");
Console.WriteLine(isMatch); // True
string result = Regex.Replace("123abc456", @"\d+", "X");
Console.WriteLine(result); // XabcX
Основные методы для работы с текстом
Класс Regex предоставляет четыре ключевых метода: IsMatch, Match, Matches и Split. Рассмотрим каждый из них с примерами.
Метод IsMatch — проверка соответствия
Метод IsMatch возвращает bool, указывающий, найдено ли хотя бы одно совпадение с шаблоном в строке.
string email = "user@example.com";
string pattern = @"^[\w\.-]+@[\w\.-]+\.\w{2,4}$";
if (Regex.IsMatch(email, pattern))
{
Console.WriteLine("Email корректен");
}
else
{
Console.WriteLine("Email некорректен");
}
Этот пример проверяет, соответствует ли строка простому шаблону email-адреса.
Методы Match и Matches — поиск совпадений
Match возвращает первое совпадение, а Matches — коллекцию всех совпадений в виде объекта MatchCollection.
string text = "Цена: 1500 руб. Скидка: 200 руб. Итого: 1300 руб.";
string pattern = @"\d+";
// Первое совпадение
Match firstMatch = Regex.Match(text, pattern);
Console.WriteLine($"Первое число: {firstMatch.Value}"); // 1500
// Все совпадения
MatchCollection allMatches = Regex.Matches(text, pattern);
Console.WriteLine("Все числа:");
foreach (Match match in allMatches)
{
Console.WriteLine($" - {match.Value}"); // 1500, 200, 1300
}
Объект Match содержит не только значение (Value), но и позицию в строке (Index) и длину (Length).
Метод Split — разделение строки
Regex.Split разделяет строку на массив подстрок по указанному шаблону. Это аналог String.Split, но с поддержкой регулярных выражений.
string data = "Иван;25;Москва;программист";
string pattern = @";";
string[] parts = Regex.Split(data, pattern);
foreach (string part in parts)
{
Console.WriteLine(part);
}
// Вывод:
// Иван
// 25
// Москва
// программист
Группировка и захват данных
Одна из самых мощных возможностей регулярных выражений — использование групп для извлечения отдельных частей совпадения. В C# группы представлены объектом Group внутри Match.
Именованные и нумерованные группы
Группы задаются круглыми скобками (). Именованные группы используют синтаксис (?<имя>...).
string logEntry = "2025-03-15 14:30:00 ERROR: Сбой в модуле 'Database'";
string pattern = @"(?<date>\d{4}-\d{2}-\d{2})\s(?<time>\d{2}:\d{2}:\d{2})\s(?<level>\w+):\s(?<message>.*)";
Match match = Regex.Match(logEntry, pattern);
if (match.Success)
{
Console.WriteLine($"Дата: {match.Groups["date"].Value}"); // 2025-03-15
Console.WriteLine($"Время: {match.Groups["time"].Value}"); // 14:30:00
Console.WriteLine($"Уровень: {match.Groups["level"].Value}"); // ERROR
Console.WriteLine($"Сообщение: {match.Groups["message"].Value}"); // Сбой в модуле 'Database'
}
Именованные группы делают код самодокументируемым и упрощают извлечение данных из сложных строк.
Замена с использованием групп
Метод Replace поддерживает обратные ссылки на группы в строке замены. Для нумерованных групп используется $1, $2 и т.д., для именованных — ${имя}.
string phone = "+7 (123) 456-78-90";
string pattern = @"\+7\s\((\d{3})\)\s(\d{3})-(\d{2})-(\d{2})";
string replacement = "8-$1-$2-$3-$4";
string formatted = Regex.Replace(phone, pattern, replacement);
Console.WriteLine(formatted); // 8-123-456-78-90
Практические примеры использования
Рассмотрим несколько реальных задач, которые можно решить с помощью регулярных выражений в C#.
Валидация email-адреса
public static bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false;
string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";