Спецсимволы и базовые классы символов

Спецсимволы определяют типы и позиции символов в строке. Любой метасимвол можно экранировать обратным слешем (\), чтобы искать его как обычный текстовый знак:

Символ Что означает Пример совпадения
. Любой один символ (кроме переноса строки без флага s) a.c → abc, a1c, a-c
\d / \D Любая цифра [0-9] / Любой символ, кроме цифры \d4 → 2026
\w / \W Буква, цифра или подчеркивание [a-zA-Z0-9_] / Не слово \w+ → user_name
\s / \S Любой пробельный символ (пробел, таб, перенос) / Не пробел \s+ → несколько пробелов
^ / $ Начало строки / Конец строки (или линии с флагом m) ^https → только в начале
\b / \B Граница слова / Не граница слова \bcat\b → cat (но не catalog)

Квантификаторы: жадные, ленивые и точные

Квантификаторы задают, сколько раз должен повториться предшествующий символ или группа:

Базовые
  • * : 0 или больше раз
  • + : 1 или больше раз
  • ? : 0 или 1 раз (опционально)
Интервалы
  • {3} : ровно 3 раза
  • {2,5} : от 2 до 5 раз
  • {3,} : от 3 раз и больше
Ленивые (Lazy)
  • *? : минимум повторений
  • +? : остановиться на первом
  • {2,5}? : взять наименьшее (2)

Группировка и Lookaround проверки (Zero-Width Assertions)

Круглые скобки создают группы захвата (capturing groups), а специальные префиксы превращают их в мощные логические условия:

  • (abc) — Захватывающая группа. Запоминает совпадение в переменную $1.
  • (?:abc) — Non-capturing group. Группирует логику без накладных расходов на сохранение в память.
  • (?<name>abc) — Именованная группа (Named Group). Доступна по имени в объекте match.groups.name.
  • (?=abc) — Positive Lookahead. Проверяет, что далее следует abc, не сдвигая каретку.
  • (?!abc) — Negative Lookahead. Требует, чтобы далее НЕ следовало abc.
  • (?<=abc) — Positive Lookbehind. Проверяет, что слева предшествует abc.
  • (?<!abc) — Negative Lookbehind. Проверяет, что слева НЕ предшествует abc.

6 готовых проверенных шаблонов для копирования

1. Email адрес (Практический стандарт)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
2. URL с протоколом http/https
^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$
3. Номер телефона (международный формат E.164)
^\+?[1-9]\d{1,14}$
4. Дата в формате YYYY-MM-DD (ISO 8601)
^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
5. IPv4 адрес (валидация октетов от 0 до 255)
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
6. HEX цвет (#RGB или #RRGGBB)
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

Связанные инструменты Digital Vault PRO

⚡ Тестируйте выражения онлайн в реальном времени с подсветкой групп, синтаксических ошибок и флагов:
Открыть тестер регулярных выражений→

Частые вопросы

Чем отличаются «жадные» (greedy) и «ленивые» (lazy) квантификаторы в Regex?

По умолчанию квантификаторы (*, +, {n,}) являются жадными: они захватывают максимально длинную подходящую подстроку. Добавление вопросительного знака (?, *?, +?, {n,}?) делает квантификатор ленивым: он останавливает поиск на первом же совпадении. Например, для строки "<p>один</p><p>два</p>" шаблон "<p>.*</p>" захватит всю строку целиком, а ленивый "<p>.*?</p>" найдет каждый параграф по отдельности.

В чём разница между Positive Lookahead (?=...) и Negative Lookahead (?!...)?

Lookahead (опережающая проверка) проверяет наличие подстроки впереди, не включая её в финальный результат совпадения (zero-width assertion). Positive Lookahead (?=...) требует обязательного присутствия указанного шаблона (например, \d+(?=px) найдет только числа перед "px"). Negative Lookahead (?!...) требует отсутствия шаблона (например, (?!admin) отфильтрует строки без слова "admin").

Какой шаблон регулярного выражения использовать для валидации Email по RFC 5322?

Полный стандарт RFC 5322 слишком громоздок для повседневной веб-разработки. Для практичной проверки большинства обычных email-адресов используется стандартный паттерн: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$. На бэкенде финальной проверкой всегда должна быть отправка письма с кодом подтверждения.

Что означают основные флаги регулярных выражений: g, i, m, s, u, y?

Флаги модифицируют логику движка: g (global) — искать все совпадения, а не останавливаться на первом; i (ignoreCase) — не учитывать регистр (А=а); m (multiline) — символы ^ и $ привязываются к началу и концу каждой строки; s (dotAll) — точка (.) начинает захватывать символ переноса строки (\n); u (unicode) — корректная обработка 4-байтовых UTF-16 и эмодзи; y (sticky) — поиск строго с текущей позиции lastIndex.

Что такое ReDoS (катастрофический бэктрекинг) и как его избежать?

ReDoS (Regular Expression Denial of Service) возникает, когда регулярное выражение с вложенными квантификаторами (например, (a+)+$) обрабатывает несовпадающую длинную строку. Движок начинает перебирать триллионы комбинаций ветвления, замораживая поток Node.js или браузера со 100% загрузкой процессора. Защита: избегать вложенных квантификаторов, использовать атомарные группы и ставить таймаут исполнения.