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

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

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

Начать курс

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

Регулярные выражения (regex) — мощный инструмент для поиска, извлечения и замены текста по шаблону. В C# (.NET) работа с регулярками реализована через пространство имён System.Text.RegularExpressions и класс Regex. В этой статье мы разберём основные возможности на реальных примерах: от простого поиска до валидации email и телефона.

1. Основы: класс Regex и его методы

Главный класс для работы — Regex. Он предоставляет статические и экземплярные методы. Вот основные:

  • IsMatch — проверяет, содержит ли строка совпадение с шаблоном.
  • Match — находит первое совпадение.
  • Matches — находит все совпадения.
  • Replace — заменяет совпадения на указанную строку.
  • Split — разбивает строку по шаблону.

Пример 1. Простая проверка

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "Привет, мой номер: 123-456-7890";
        string pattern = @"\d{3}-\d{3}-\d{4}";

        if (Regex.IsMatch(text, pattern))
        {
            Console.WriteLine("Номер найден!");
        }
    }
}

В этом примере \d{3} означает «ровно три цифры». Обратный слеш экранируется с помощью @ (вербатим-строка).

2. Группы захвата и извлечение данных

Группы захвата позволяют извлечь части совпадения. Они задаются круглыми скобками (). Каждая группа получает порядковый номер (начиная с 1).

Пример 2. Извлечение имени и домена из email

string email = "user@example.com";
string pattern = @"^(\w+)@(\w+\.\w+)$";

Match match = Regex.Match(email, pattern);

if (match.Success)
{
    Console.WriteLine($"Логин: {match.Groups[1].Value}");   // user
    Console.WriteLine($"Домен: {match.Groups[2].Value}");   // example.com
}

Здесь (\w+) захватывает одно или более буквенно-цифровых символов. ^ и $ — якоря начала и конца строки.

Пример 3. Разбор URL

string url = "https://pythonlib.ru/page?id=42";
string pattern = @"^(https?)://([^/]+)(/.*)?$";

Match m = Regex.Match(url, pattern);
if (m.Success)
{
    Console.WriteLine($"Протокол: {m.Groups[1].Value}"); // https
    Console.WriteLine($"Домен: {m.Groups[2].Value}");    // pythonlib.ru
    Console.WriteLine($"Путь: {m.Groups[3].Value}");     // /page?id=42
}

3. Замена и удаление текста

Метод Replace позволяет заменять найденные фрагменты. Можно использовать обратные ссылки вида $1, $2 для вставки групп.

Пример 4. Форматирование номера телефона

string raw = "89161234567";
string pattern = @"(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})";
string replacement = "+7 ($2) $3-$4-$5";

string formatted = Regex.Replace(raw, pattern, replacement);
Console.WriteLine(formatted); // +7 (916) 123-45-67

Пример 5. Удаление лишних пробелов

string text = "Это    текст   с    лишними   пробелами.";
string cleaned = Regex.Replace(text, @"\s+", " ");
Console.WriteLine(cleaned); // "Это текст с лишними пробелами."

\s+ — один или более пробельных символов. Заменяем на одиночный пробел.

4. Реальные кейсы: валидация email и телефона

На практике регулярки чаще всего используют для проверки пользовательского ввода. Приведём два типовых примера.

Проверка 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,}$";
    return Regex.IsMatch(email, pattern);
}

// Использование:
Console.WriteLine(IsValidEmail("test@mail.ru"));       // True
Console.WriteLine(IsValidEmail("invalid@com"));        // False (нет точки)

Этот шаблон допускает точки, проценты, плюсы и дефисы в имени. Для продакшена стоит использовать более строгие правила или библиотечную проверку через MailAddress.

Проверка российского номера телефона

public static bool IsValidRussianPhone(string phone)
{
    // Очищаем от лишних символов
    string cleaned = Regex.Replace(phone, @"[\s\-\(\)]", "");

    // Шаблон: +7 или 8, затем 10 цифр
    string pattern = @"^(\+7|8)\d{10}$";
    return Regex.IsMatch(cleaned, pattern);
}

// Примеры:
Console.WriteLine(IsValidRussianPhone("+7 (916) 123-45-67")); // True
Console.WriteLine(IsValidRussianPhone("89161234567"));        // True
Console.WriteLine(IsValidRussianPhone("1234567890"));         // False

Сначала удаляем все пробелы, скобки и дефисы, затем проверяем формат.

5. Продвинутые возможности: опции и компиляция

Класс Regex поддерживает опции, которые меняют поведение поиска:

  • RegexOptions.IgnoreCase — игнорировать регистр.
  • RegexOptions.Multiline — якоря ^ и $ работают для каждой строки.
  • RegexOptions.Compiled — компилирует регулярку в сборку для ускорения.

Пример 6. Поиск без учёта регистра

string text = "C# и c# — разные записи?";
string pattern = @"c#";

// Без опции
Console.WriteLine(Regex.Matches(text, pattern).Count); // 1 (только c#)

// С опцией
Console                

Блоги

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