Регулярные выражения в C# с примерами: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Регулярные выражения в 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 предоставляет все необходимые методы для поиска, извлечения, замены и разделения строк. Используя группы захвата, опции компиляции и вербатимные строки, вы

Блоги

Рекомендаций по книгам