Обзор (Что это)
Это технический справочник по использованию регулярных выражений, ориентированный на практическое применение и переносимость. Охватываются синтаксис, обработка многострочных паттернов, техники замены, совместимость с инструментами и проектирование поддерживаемых шаблонов.
Цель (Зачем это нужно)
Регулярные выражения — основа обработки текста: валидации, парсинга, трансформации и извлечения данных. Используются во всех языках программирования и на всех платформах. Грамотное использование позволяет эффективно автоматизировать процессы и структурировать данные.
Part 1: Базовый синтаксис
Шаблон | Значение | Пример | Совпадения |
---|---|---|---|
. |
Любой символ, кроме новой строки | a.c |
abc , a-c |
* |
0 или более повторений предыдущего | go*gle |
ggle , google |
+ |
1 или более повторений | go+gle |
gogle , google |
? |
0 или 1 повторение | colou?r |
color , colour |
{n} |
Ровно n повторений |
a{3} |
aaa |
{n,m} |
От n до m повторений |
a{2,4} |
aa , aaa , aaaa |
^ |
Начало строки | ^abc |
Строка, начинающаяся с abc |
$ |
Конец строки | abc$ |
Строка, заканчивающаяся на abc |
[] |
Один из символов | [abc] |
a , b , c |
[^] |
Любой символ, кроме указанных | [^0-9] |
Все, кроме цифр |
\d |
Цифра | \d+ |
123 , 007 |
\D |
Не цифра | \D+ |
abc , XYZ |
\w |
Буква, цифра или _ |
\w+ |
abc_123 |
\W |
Не буква/цифра/_ |
\W+ |
#@! , пробелы и т.п. |
\s |
Пробельный символ | \s+ |
Пробел, табуляция, \n и др. |
\S |
Непробельный символ | \S+ |
abc , 123 |
` | ` | Логическое ИЛИ | `foo |
() |
Группировка | (abc)+ |
abcabc |
\b |
Граница слова | \bregex\b |
Только слово "regex" |
Part 2: Практические шаблоны (многоязычная поддержка)
Назначение | Шаблон | Примечание |
---|---|---|
Только цифры | ^\d+$ |
Полностью цифровая строка |
Дробное число | ^\d+\.\d+$ |
Одна точка допустима |
Только латиница и цифры | ^[a-zA-Z0-9]+$ |
Для ID или логинов |
Email (упрощённо) | ^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$ |
Общее применение |
URL (http/https) | https?://[\w.-]+\.[a-zA-Z]{2,}(/[\w./?=&%-]*)? |
С путём и параметрами |
Дата ISO | \d{4}-\d{2}-\d{2} |
ГГГГ-ММ-ДД |
Международный телефон | \+\d{1,3}[\s-]?\d{1,14} |
Пример: +7 912... |
Имя пользователя | ^[a-zA-Z0-9._-]{3,20}$ |
Для соцсетей и т.п. |
Сложный пароль | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ |
Содержит заглавные, строчные, цифры |
Part 3: Многострочные выражения (Multi-Line)
🔹 Почему использовать [\s\S]*?
Так как .
не захватывает переводы строк, для охвата многострочных блоков используется:
[\s\S]*?
Это охватывает все символы, включая переводы строк, с минимальным захватом (нежадный режим).
💡 Примечание: В некоторых инструментах допустимо
[\s\S\n]*?
— избыточно, но полезно для совместимости.
🔹 Частые шаблоны
Назначение | Шаблон | Комментарий |
---|---|---|
Любой текстовый блок | [\s\S]*? |
Безопасный способ охвата |
HTML-блок <div> |
<div[\s\S]*?</div> |
Открывающий и закрывающий div |
HTML-комментарии | <!--[\s\S]*?--> |
Комментарии |
Markdown-код | "[\s\S]*? " |
Блоки кода в тройных бэктиках |
Part 4: Техники замены (Replacement Techniques)
🔹 Синтаксис подстановки групп
В зависимости от инструмента:
${1}
,${2}
— VSCode, Python, .NET$1
,$2
— JavaScript, sed
🔹 Примеры
Назначение | Шаблон | Замена |
---|---|---|
Поменять слова местами | (\w+)\s+(\w+) |
${2} ${1} |
Обернуть в <span> |
>([^<]+)< |
><span>${1}</span>< |
CSV → JSON | ^([^,]+),([^,]+),([^,]+)$ |
{ "a": "${1}", "b": "${2}", "c": "${3}" } |
Формат даты | (\d{4})/(\d{2})/(\d{2}) |
${1}-${2}-${3} |
CamelCase → snake_case | ([a-z])([A-Z]) |
${1}_${2} |
Part 5: Совместимость с инструментами
Инструмент | Многострочность | Нежадность | Подстановка | Особенности |
---|---|---|---|---|
VSCode | ✅ (панель поиска) | ✅ | ${1} |
[\s\S]*? или [\s\S\n]*? |
JavaScript | ✅ (s -флаг) |
✅ | $1 , $<name> |
Поддержка имён групп |
Python (re ) |
✅ (re.DOTALL ) |
✅ | \g<1> или \1 |
Используйте raw-строки r"" |
sed | ❌ | ❌ | \1 , \2 |
Только базовая замена |
grep/egrep | ❌ | ❌ | ❌ | Только поиск, без замены |
Part 6: Рекомендации по проектированию
✅ Хорошая практика
- Для многострочных шаблонов используйте
[\s\S]*?
- Избегайте
.*
, предпочтительнее нежадные выражения - Для некаптурирующих групп используйте
(?:...)
- Применяйте именные группы:
(?<year>\d{4})
- Для сложных выражений используйте
re.VERBOSE
и комментарии
❌ Антипаттерны
Шаблон | Проблема |
---|---|
.* |
Захватывает больше, чем нужно (жадное поведение) |
[^a-z] |
Не подходит для языков с акцентами и Юникодом |
Глубокие деревья | Не подходит для вложенных HTML/XML |
.+ |
Совпадает даже с пробельными строками |
Заключение
Это руководство — универсальный справочник для безопасного и эффективного использования регулярных выражений.
Используйте [\s\S]*?
для многострочной обработки, учитывайте особенности используемого инструмента, придерживайтесь читаемого и поддерживаемого стиля.
Грамотно спроектированное регулярное выражение — мощный и переиспользуемый инструмент.