Регулярные выражения в C#: основы работы с классом Regex
Регулярные выражения (regex) — это мощный инструмент для поиска, извлечения, замены и проверки строк по заданному шаблону. В C# (.NET) вся работа с регулярными выражениями сосредоточена в пространстве имен System.Text.RegularExpressions и центральном классе Regex. В этой статье мы разберем базовые и продвинутые возможности регулярных выражений в C# на практических примерах.
1. Класс Regex: основные методы и создание шаблонов
Для работы с регулярными выражениями в C# вам нужно подключить пространство имен:
using System.Text.RegularExpressions;
Класс Regex предоставляет несколько ключевых методов:
- IsMatch — проверяет, содержит ли строка совпадение с шаблоном.
- Match — возвращает первое совпадение.
- Matches — возвращает все совпадения.
- Replace — заменяет найденные совпадения на указанную строку.
- Split — разделяет строку по совпадениям.
Простой пример проверки email-адреса:
string email = "user@example.com";
string pattern = @"^[\w\.-]+@[\w\.-]+\.\w+$";
bool isValid = Regex.IsMatch(email, pattern);
Console.WriteLine(isValid); // True
Обратите внимание на символ @ перед строкой — это вербатимная строка (verbatim string), которая упрощает написание обратных слешей (\) в шаблонах.
2. Поиск и извлечение данных: методы Match и Matches
Метод Match возвращает объект Match, который содержит информацию о первом совпадении. Если совпадений нет, свойство Success будет равно false.
Пример извлечения телефонного номера из текста:
string text = "Позвоните по номеру +7 (123) 456-78-90 или +7 (987) 654-32-10";
string pattern = @"\+7\s?\(\d{3}\)\s?\d{3}-\d{2}-\d{2}";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
// Вывод:
// +7 (123) 456-78-90
// +7 (987) 654-32-10
Метод Matches возвращает коллекцию всех совпадений. Вы также можете использовать группы захвата для извлечения отдельных частей:
string text = "ID: 12345, Цена: 999.99";
string pattern = @"Цена:\s*(\d+\.?\d*)";
Match match = Regex.Match(text, pattern);
if (match.Success)
{
string price = match.Groups[1].Value;
Console.WriteLine($"Цена: {price}"); // Цена: 999.99
}
Группы захвата обозначаются круглыми скобками () в шаблоне. Нулевая группа — это всё совпадение, а группы с 1 по N — это захваченные подстроки.
3. Замена и разделение строк: Replace и Split
Метод Replace позволяет гибко заменять совпадения. Поддерживаются обратные ссылки ($1, $2 и т.д.) для вставки захваченных групп.
Пример форматирования даты с "YYYY-MM-DD" на "DD.MM.YYYY":
string date = "2025-03-15";
string pattern = @"(\d{4})-(\d{2})-(\d{2})";
string replacement = "$3.$2.$1";
string result = Regex.Replace(date, pattern, replacement);
Console.WriteLine(result); // 15.03.2025
Метод Split разбивает строку по совпадениям с шаблоном. Это удобно для парсинга CSV или логов:
string data = "apple;banana;cherry;grape";
string pattern = @";";
string[] fruits = Regex.Split(data, pattern);
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}
// Вывод:
// apple
// banana
// cherry
// grape
Вы также можете использовать более сложные разделители, например, несколько пробелов или знаков препинания:
string text = "раз два,три;четыре";
string[] parts = Regex.Split(text, @"[\s,;]+");
Console.WriteLine(string.Join(", ", parts)); // раз, два, три, четыре
4. Оптимизация и советы по работе с Regex в C#
При работе с большими объёмами данных или частыми вызовами одного и того же шаблона рекомендуется создавать статический экземпляр Regex с опцией Compiled. Это увеличит скорость выполнения, но потребует больше памяти при инициализации.
private static readonly Regex EmailRegex = new Regex(
@"^[\w\.-]+@[\w\.-]+\.\w+$",
RegexOptions.Compiled | RegexOptions.IgnoreCase
);
bool IsValidEmail(string email)
{
return EmailRegex.IsMatch(email);
}
Полезные опции (флаги) RegexOptions:
IgnoreCase— игнорировать регистр символов.Multiline— изменяет поведение^и$для работы с началом/концом каждой строки.Singleline— заставляет точку.совпадать с любым символом, включая перевод строки.Compiled— компилирует регулярное выражение в MSIL для повышения производительности.
Пример проверки пароля (минимум 8 символов, хотя бы одна цифра и одна заглавная буква):
string password = "MyPass123";
string pattern = @"^(?=.*[A-Z])(?=.*\d).{8,}$";
bool isStrong = Regex.IsMatch(password, pattern);
Console.WriteLine(isStrong); // True
Здесь используются «позитивные опережающие проверки» ((?=...)), которые не захватывают символы, а только проверяют их наличие.
Заключение
Регулярные выражения в C# — это незаменимый инструмент для обработки текстовой информации. Класс Regex предоставляет все необходимые методы для поиска, извлечения, замены и разделения строк. Используя группы захвата, опции компиляции и вербатимные строки, вы