Регулярные выражения
Весь синтаксис регулярных выражений на одной странице: классы, квантификаторы, группы, якоря, lookahead, флаги и готовые паттерны (email, дата, URL).
Регулярное выражение (regex) — это компактный язык шаблонов для поиска и разбора текста: ты описываешь, как выглядит нужная строка, а движок находит совпадения. Ниже — весь синтаксис на одной странице, прямо в комментариях рядом с паттернами. Символ # здесь обозначает пояснение, а не часть шаблона.
Что такое regex и базовый поиск
Самые простые шаблоны — это литералы: буквы и цифры совпадают сами с собой.
cat # совпадёт с "cat" в "cat", "category", "scatter"
hello world # пробел — обычный символ, ищет точную подстроку
123 # цифры-литералы, совпадут с "123" в "id123abc"
Cat # по умолчанию РЕГИСТРОЗАВИСИМО: НЕ совпадёт с "cat"
(?i)cat # инлайн-флаг (?i) включает игнор регистра: "Cat", "CAT", "cat"Метасимволы (. ^ $ и экранирование)
Некоторые символы имеют особое значение. Чтобы искать их буквально — экранируй обратным слэшем \.
. # любой ОДИН символ (кроме перевода строки): "a.c" -> "abc", "a7c"
a.c # "abc", "a-c", "a c", но НЕ "ac" (нужен ровно один символ)
\. # буквальная точка: совпадёт только с "."
file\.txt # ищет именно "file.txt", а не "fileXtxt"
\$\^\* # буквальные доллар, крышка, звёздочка
\\ # буквальный обратный слэш
^ # якорь начала строки (см. раздел про якоря)
$ # якорь конца строкиКлассы символов
В квадратных скобках [...] перечисляют допустимые символы — совпадёт ровно один из них.
[abc] # один символ: "a", "b" или "c"
[a-z] # любая строчная латинская буква (диапазон)
[A-Za-z0-9] # буква или цифра (несколько диапазонов подряд)
[^abc] # ОТРИЦАНИЕ: любой символ, КРОМЕ a, b, c
gr[ae]y # "gray" или "grey"
[0-9.] # цифра ИЛИ точка (внутри [] точка — обычный символ)Сокращённые классы
\d # цифра, эквивалент [0-9]
\w # "словесный" символ: буква, цифра или _ ([A-Za-z0-9_])
\s # пробельный символ: пробел, таб, перевод строки
\D # НЕ цифра (заглавная = отрицание)
\W # НЕ словесный символ (знаки пунктуации, пробелы)
\S # НЕ пробельный символ
\d\d\d # три цифры подряд: "007", "123"Квантификаторы
Указывают, сколько раз повторяется предыдущий элемент. По умолчанию жадные — берут максимум.
a* # 0 или больше "a": "", "a", "aaaa"
a+ # 1 или больше "a": "a", "aaaa" (но не "")
a? # 0 или 1 "a": необязательный символ
a{3} # ровно 3: "aaa"
a{2,4} # от 2 до 4: "aa", "aaa", "aaaa"
a{2,} # 2 и больше
\d+ # одно или больше цифр: целое число
\d{4} # ровно 4 цифры: год "2026"
colou?r # "color" и "colour" (u необязательна)Жадность и ленивость
Добавь ? после квантификатора, чтобы сделать его ленивым — он возьмёт минимально возможное совпадение.
<.+> # ЖАДНО: в "<a><b>" захватит ВСЁ "<a><b>"
<.+?> # ЛЕНИВО: в "<a><b>" захватит только "<a>"
".*" # жадно: от первой кавычки до ПОСЛЕДНЕЙ
".*?" # лениво: до ближайшей закрывающей кавычки
a+? # 1 "a", но минимально (отдаст лишнее назад)
\d{2,5}? # минимум из диапазона: возьмёт 2 цифры, если хватитГруппы и захват
Круглые скобки (...) группируют часть шаблона и захватывают совпавший текст в нумерованную группу.
(ab)+ # группировка: "ab", "abab", "ababab"
(\d{4})-(\d{2}) # группа 1 = год, группа 2 = месяц
(foo|bar)bar # альтернатива внутри группы + "bar"
(.)\1 # ОБРАТНАЯ ССЫЛКА: символ, за которым тот же символ ("aa", "==")
(\w+) \1 # повтор слова: "the the", "go go"
<(\w+)>.*</\1> # парный тег: <b>текст</b> (\1 = "b")Именованные и незахватывающие группы
Имена делают группы читаемыми, а (?:...) группирует без захвата (быстрее и не сдвигает нумерацию).
(?P<year>\d{4}) # именованная группа (Python-синтаксис), имя "year"
(?<year>\d{4}) # тот же смысл (JS / .NET / PCRE-синтаксис)
(?P=year) # обратная ссылка на именованную группу (Python)
\k<year> # обратная ссылка на имя (JS / .NET)
(?:abc)+ # НЕЗАХВАТЫВАЮЩАЯ группа: повторяем, но не сохраняем
(?:https?|ftp):// # сгруппировали альтернативу без лишнего захватаЯкоря и границы
Якоря не совпадают с символами — они указывают позицию в тексте.
^abc # строка НАЧИНАЕТСЯ с "abc"
abc$ # строка ЗАКАНЧИВАЕТСЯ на "abc"
^abc$ # вся строка — ровно "abc"
^$ # пустая строка
\bword\b # ГРАНИЦА СЛОВА: "word" целиком, не "wording", "sword"
\bcat\b # совпадёт в "the cat sat", но не в "category"
\Bcat\B # "cat" ВНУТРИ слова: совпадёт в "scatter"
\d+\b # цифры до границы словаАльтернация
Вертикальная черта | означает «или». Группируй варианты скобками, чтобы ограничить её область.
cat|dog # "cat" ИЛИ "dog"
gr(a|e)y # "gray" или "grey" (альтернатива ограничена группой)
^(yes|no)$ # вся строка — либо "yes", либо "no"
(Mon|Tue|Wed|Thu|Fri) # один из дней недели
https?:// # хитрость: s? = "http" или "https" без альтернацииLookahead и lookbehind
Проверки смотрят вперёд/назад, но не включают этот текст в совпадение (нулевая ширина).
foo(?=bar) # ПОЗИТИВНЫЙ lookahead: "foo", только если дальше "bar"
foo(?!bar) # НЕГАТИВНЫЙ lookahead: "foo", если дальше НЕ "bar"
(?<=\$)\d+ # ПОЗИТИВНЫЙ lookbehind: число после знака "$" (сам $ не в матче)
(?<!\\)" # НЕГАТИВНЫЙ lookbehind: кавычка, НЕ экранированная слэшем
\d+(?= руб) # число перед " руб": из "100 руб" вернёт "100"
(?=.*\d)(?=.*[A-Z]).{8,} # пароль: есть цифра, есть заглавная, длина >= 8Флаги
Флаги меняют поведение всего шаблона. Их пишут после слэша (/abc/gi в JS) или инлайн как (?i).
/cat/i # i — IGNORECASE: "Cat", "CAT", "cat"
/cat/g # g — GLOBAL: все совпадения, а не только первое (JS)
/^line/m # m — MULTILINE: ^ и $ ловят начало/конец КАЖДОЙ строки
/a.b/s # s — DOTALL/singleline: точка . теперь ловит и перевод строки
/word/gi # флаги комбинируются: глобально + без регистра
(?im)^cat # инлайн-флаги: то же без синтаксиса /.../Практические примеры
Готовые шаблоны для частых задач. Подгоняй под свои требования — «идеального» regex для email не существует, но эти покрывают большинство случаев.
# E-mail (упрощённо)
[\w.+-]+@[\w-]+\.[\w.-]+ # [email protected]
# Телефон (РФ): +7 999 123-45-67 и варианты
\+?[78][\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}
# Дата ДД.ММ.ГГГГ
([0-2]\d|3[01])\.(0\d|1[0-2])\.\d{4} # 16.06.2026
# Дата ISO ГГГГ-ММ-ДД
\d{4}-\d{2}-\d{2} # 2026-06-16
# URL
https?://[\w.-]+(?:/[\w.~:/?#\[\]@!$&\(\)*+,;=%-]*)? # http(s)://host/path?q
# IPv4-адрес
\b(?:\d{1,3}\.){3}\d{1,3}\b # 192.168.0.1 (без проверки 0-255)
# HEX-цвет
#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b # #fff или #1a2b3c
# Только цифры (вся строка)
^\d+$ # "12345", но не "12a"