Регулярные выражения (regex, regexp) — один из мощнейших инструментов в арсенале программиста. Они позволяют искать, заменять и извлекать данные из текста с помощью компактных шаблонов. Освоив regex, вы сможете за одну строку кода решать задачи, на которые иначе ушли бы десятки строк. Этот справочник покрывает весь синтаксис — от простейших символов до lookahead, lookbehind и именованных групп.

Примеры в руководстве протестированы в RegexLab и применимы к Python (модуль re), JavaScript (встроенный RegExp) и PHP (функции preg_*). Там, где синтаксис отличается между языками, это явно указано.

Базовый синтаксис регулярных выражений

Большинство символов в regex совпадают сами с собой — буква a находит букву «a» в тексте. Но ряд символов имеет специальное значение и называется метасимволами. Их нужно либо использовать по их семантике, либо экранировать обратным слешем для поиска буквального значения.

СимволЗначениеПример паттернаСовпадает с
.Любой символ, кроме новой строкиc.tcat, cut, c9t
^Начало строки^Hello"Hello world" (с начала)
$Конец строкиworld$"Hello world" (в конце)
*0 или более повторенийab*cac, abc, abbc, abbbc
+1 или более повторенийab+cabc, abbc (но не ac)
?0 или 1 повторение (необязательный)colou?rcolor, colour
[]Символьный класс (один из)[aeiou]Любая гласная
{}Точное количество повторений\d{4}Ровно 4 цифры
|Альтернатива (ИЛИ)cat|dogcat или dog
()Группа захвата(ab)+ab, abab, ababab
\Экранирование метасимвола\.Буквальная точка «.»
REGEX — пример базового поискаregexlab $
# Найти все слова из 4-6 букв ^[a-zA-Z]{4,6}$ # Совпадает: love, regex, python # Не совпадает: hi, javascript (слишком длинное) # Найти IP-подобный паттерн \d+\.\d+\.\d+\.\d+ # Совпадает: 192.168.0.1, 10.0.0.1

Классы символов

Классы символов — один из самых мощных инструментов regex. Они позволяют задать набор допустимых символов для одной позиции в паттерне.

Встроенные классы

КлассЭквивалентОписание
\d[0-9]Цифра
\D[^0-9]Не цифра
\w[a-zA-Z0-9_]Буква, цифра или подчёркивание
\W[^a-zA-Z0-9_]Не слово (пробел, знак препинания…)
\s[ \t\n\r\f\v]Пробельный символ
\S[^ \t\n\r\f\v]Не пробельный символ
\bГраница слова (между \w и \W)
\BНе граница слова

Пользовательские классы и диапазоны

REGEX — классы символовregexlab $
[a-z] # строчные латинские буквы [A-Z] # прописные латинские буквы [0-9] # цифры (то же что \d) [a-zA-Z0-9] # буквы и цифры [а-яёА-ЯЁ] # кириллица [^aeiou] # НЕ гласная (отрицание через ^) [.,;:!?] # знаки препинания (литеральные внутри []) # Пример: найти шестнадцатеричные символы [0-9a-fA-F]+ # ff3300, DeadBeef, 0x1A2B
Внутри квадратных скобок большинство метасимволов теряют специальное значение. Например, [.] — это буквальная точка, а не «любой символ». Исключения: ^ (отрицание, если первый), - (диапазон), ] (закрытие), \ (экранирование).

Квантификаторы и жадность

Квантификаторы определяют, сколько раз элемент должен повториться. По умолчанию они жадные (greedy) — захватывают максимально возможное количество символов. Добавление ? делает квантификатор ленивым (lazy) — он захватывает минимально необходимое.

КвантификаторЗначениеЛенивый
*0 или более*?
+1 или более+?
?0 или 1??
{n}ровно n раз{n}? (то же)
{n,}n или более{n,}?
{n,m}от n до m{n,m}?
REGEX — жадный vs ленивыйregexlab $
# Текст: <b>жирный</b> и <i>курсив</i> # Жадный — захватит ВСЁ от первого < до последнего > <.*> # Совпадёт: <b>жирный</b> и <i>курсив</i> # Ленивый — найдёт каждый тег отдельно <.*?> # Совпадёт: <b>, </b>, <i>, </i> # Ещё пример — извлечь содержимое JSON-строки ".*?" # ленивый: каждая строка отдельно ".*" # жадный: от первой до ПОСЛЕДНЕЙ кавычки
Жадные квантификаторы могут приводить к катастрофическому возврату (catastrophic backtracking) на сложных паттернах. Если regex зависает, подозревайте вложенные квантификаторы типа (a+)+.

Группы захвата и ссылки

Группы захвата позволяют выделить часть совпадения для последующего извлечения или использования в замене. Они обозначаются круглыми скобками и нумеруются слева направо по открывающей скобке.

REGEX — группы захватаregexlab $
# Обычная группа — нумерованная (\d{4})-(\d{2})-(\d{2}) # Для "2024-03-15": $1=2024, $2=03, $3=15 # Именованная группа — Python/PCRE синтаксис (?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2}) # В Python: match.group('year'), match.group('month') # Именованная группа — JavaScript/Java синтаксис (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) # В JS: match.groups.year, match.groups.month # Незахватывающая группа (группировка без захвата) (?:https?):// # Группирует "http" и "https" без записи в $1 # Обратная ссылка — найти дублирующееся слово \b(\w+)\s+\1\b # Совпадёт с: "the the", "и и", "test test"

Lookahead и Lookbehind

Конструкции предпросмотра позволяют задать условие для совпадения без включения этого условия в результат. Они называются «нулевой ширины» — не потребляют символы строки.

КонструкцияТипОписание
(?=...)Позитивный lookaheadСледующие символы ДОЛЖНЫ совпасть
(?!...)Негативный lookaheadСледующие символы НЕ должны совпасть
(?<=...)Позитивный lookbehindПредыдущие символы ДОЛЖНЫ совпасть
(?<!...)Негативный lookbehindПредыдущие символы НЕ должны совпасть
REGEX — lookahead и lookbehindregexlab $
# Найти числа, за которыми следует " кг" \d+(?= кг) # Текст: "вес 80 кг, рост 180 см" # Совпадёт: 80 (но не 180) # Найти числа, за которыми НЕ следует " кг" \d+(?! кг) # Совпадёт: 18 (из 180) и 80 (кроме последней цифры) # Извлечь цену без знака валюты (?<=)\d+ # Текст: "₽1500 и €200" # Совпадёт: 1500 (только рублёвая цена) # Найти слова не после "не " (негативный lookbehind) (?<!не )\bхороший\b # Совпадёт в "хороший фильм", но не в "не хороший"
В JavaScript lookbehind ((?<=...) и (?<!...)) поддерживается только с ES2018. В Python lookbehind требует фиксированной ширины — переменная длина (.* внутри lookbehind) не разрешена.

Флаги регулярных выражений

Флаги изменяют режим работы всего паттерна. В JavaScript флаги записываются после второго слеша: /pattern/gi. В Python передаются в re.compile(pattern, flags).

ФлагJSPythonОписание
i (ignoreCase)/re/ire.IGNORECASEРегистронезависимый поиск. /hello/i найдёт Hello, HELLO, hElLo
g (global)/re/gre.findall()Найти все совпадения, а не только первое
m (multiline)/re/mre.MULTILINE^ и $ совпадают с началом/концом каждой строки, а не всего текста
s (dotAll)/re/sre.DOTALLТочка . совпадает с любым символом, включая перевод строки
u (unicode)/re/uпо умолчаниюПолная поддержка Unicode. Необходим для \p{} категорий
x (verbose)re.VERBOSEРазрешает пробелы и комментарии внутри паттерна для читаемости
REGEX — флаги на практикеregexlab $
# Флаг m: ^ совпадает с началом КАЖДОЙ строки ^\w+ /gm # Текст: "первое\nвторое\nтретье" # Совпадёт: "первое", "второе", "третье" # Флаг s: точка захватывает переводы строк <div>.*?</div> /s # Найдёт многострочные div-блоки # Verbose режим в Python — читаемый паттерн pattern = re.compile(r""" \d{4} # год - # разделитель \d{2} # месяц - # разделитель \d{2} # день """, re.VERBOSE)

Практические примеры

Следующие паттерны охватывают наиболее распространённые задачи. Каждый из них можно скопировать и протестировать в RegexLab прямо сейчас.

Валидация email

REGEX — Emailregexlab $
# Базовая валидация (RFC 5322 упрощённая) [a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,} # Совпадёт: user@example.com, name.surname@sub.domain.org # Не совпадёт: @no-local.com, no-at-sign, spaces @here.ru

Номер телефона

REGEX — Телефонregexlab $
# Российский номер: +7 (999) 123-45-67 и варианты (?:\+7|8)[\s\-]?\(\d{3}\)[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2} # Международный формат E.164 \+[1-9]\d{1,14}

URL

REGEX — URLregexlab $
https?://(?:www\.)?[\w\-]+(?:\.[\w\-]+)+[\w\-\._~:/?#\[\]@!$&'()*+,;=%]* # Совпадёт: https://example.com, http://sub.domain.org/path?q=1

IP-адрес (IPv4)

REGEX — IPv4regexlab $
\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b # Правильно ограничивает: 0-255 в каждом октете # Совпадёт: 192.168.1.1, 10.0.0.1, 255.255.255.0 # Не совпадёт: 256.1.1.1, 192.168.1.999

Дата в формате DD.MM.YYYY

REGEX — Датаregexlab $
(?:0[1-9]|[12]\d|3[01])\.(?:0[1-9]|1[0-2])\.\d{4} # Совпадёт: 01.01.2024, 31.12.1999 # Не совпадёт: 32.01.2024, 00.13.2024

// Протестируйте прямо сейчас

Все паттерны из этого справочника можно протестировать в RegexLab — онлайн-тестере с live-подсветкой совпадений и объяснением каждого токена. Работает офлайн, данные не покидают браузер.

Открыть RegexLab