Регулярные выражения в C# с примерами: на практике
Регулярные выражения (regex) — мощный инструмент для поиска, проверки и замены текста по шаблону. В C# (.NET) работа с ними реализована через класс System.Text.RegularExpressions.Regex. В этой статье мы разберем основные возможности на реальных примерах: от простой проверки email до извлечения данных из HTML. Все примеры готовы к копированию и использованию в ваших проектах.
Основы работы с Regex в C#
Класс Regex предоставляет три ключевых метода:
- IsMatch — проверяет, соответствует ли строка шаблону;
- Match — находит первое совпадение;
- Matches — находит все совпадения.
Простой пример — проверка, содержит ли строка цифры:
using System;
using System.Text.RegularExpressions;
public class RegexExample
{
public static void Main()
{
string text = "Мой номер: 12345";
string pattern = @"\d+"; // одна или более цифр
bool hasDigits = Regex.IsMatch(text, pattern);
Console.WriteLine(hasDigits); // True
}
}
Обратите внимание на @ перед строкой — это verbatim string literal, который отключает экранирование обратной косой черты. Без него пришлось бы писать "\\d+".
Проверка email и номера телефона
Валидация email
Проверка email — классическая задача. Простой, но рабочий паттерн:
public static bool IsValidEmail(string email)
{
string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
return Regex.IsMatch(email, pattern);
}
// Использование
Console.WriteLine(IsValidEmail("user@example.com")); // True
Console.WriteLine(IsValidEmail("user@.com")); // False
Разберем паттерн:
^— начало строки;[a-zA-Z0-9._%+-]+— локальная часть (буквы, цифры и спецсимволы);@— символ "собаки";[a-zA-Z0-9.-]+— домен;\.— точка (экранированная);[a-zA-Z]{2,}— доменная зона (не менее 2 букв);$— конец строки.
Проверка номера телефона
Пример для российского формата (+7 XXX XXX-XX-XX):
public static bool IsValidRussianPhone(string phone)
{
string pattern = @"^\+7\d{3}\d{3}-\d{2}-\d{2}$";
// Или более гибкий вариант:
// @"^\+7[\s-]?\d{3}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$"
return Regex.IsMatch(phone, pattern);
}
Извлечение данных из текста с помощью групп захвата
Группы захвата (скобки ()) позволяют извлекать части совпадения. Например, извлечем все email из текста:
string text = "Контакты: support@site.com, admin@test.org, info@company.net";
string pattern = @"([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,})";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match match in matches)
{
Console.WriteLine($"Полный email: {match.Value}");
Console.WriteLine($"Локальная часть: {match.Groups[1].Value}");
Console.WriteLine($"Домен: {match.Groups[2].Value}");
Console.WriteLine($"Зона: {match.Groups[3].Value}");
Console.WriteLine("---");
}
Результат:
Полный email: support@site.com
Локальная часть: support
Домен: site
Зона: com
---
Группы нумеруются с 1 (группа 0 — всё совпадение). Можно давать им имена:
string pattern = @"(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+)\.(?<tld>[a-zA-Z]{2,})";
// Доступ: match.Groups["user"].Value
Извлечение ссылок из HTML
string html = @"<a href='https://example.com'>Example</a>
<a href="/about">About us</a>";
string pattern = @"<a\s+href=['""]([^'""]+)['""]>";
MatchCollection matches = Regex.Matches(html, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value);
}
// Вывод:
// https://example.com
// /about
Замена текста с регулярными выражениями
Метод Replace позволяет заменять части строк по шаблону. Пример — цензурирование email в логах:
string log = "User user@example.com logged in. Admin admin@site.com approved.";
string pattern = @"\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b";
string result = Regex.Replace(log, pattern, "***@***.***");
Console.WriteLine(result);
// User ***@***.*** logged in. Admin ***@***.*** approved.
Форматирование дат
Заменим формат даты с "2025-03-15" на "15.03.2025":
string dates = "2025-03-15, 2024-12-01";
string pattern = @"(\d{4})-(\d{2})-(\d{2})";
string result = Regex.Replace(dates, pattern, "$3.$2.$1");
Console.WriteLine(result);
// 15.03.2025, 01.12.2024
Здесь $1, $2, $3 — ссылки на группы захвата.
Использование MatchEvaluator для сложной замены
string text = "Цена: 1500 руб, скидка: 300 руб";
string pattern = @"\d+(?=\s*руб)";
string result = Regex.Replace(text, pattern, match =>
{
int value = int.Parse(match.Value);
return (value *