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