LEARN X · ЗА 14 МИН

Регулярные выражения

Весь синтаксис регулярных выражений на одной странице: классы, квантификаторы, группы, якоря, 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"
Поддержать проект