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

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

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

Начать курс

Регулярные выражения в 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,}$";                

Блоги

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