Проверка регулярных выражений

Проверяйте регулярные выражения онлайн для JavaScript, PHP и Python: подсветка совпадений и групп захвата сразу по мере ввода.

Флаги
//g

Вставьте текст — совпадения подсветятся здесь

Готовые шаблоны — кликните, чтобы подставить

Что такое регулярные выражения

Регулярное выражение (regex, regexp) — это шаблон, который описывает набор строк по правилам, а не перечисляет их буквально. Шаблон ^\d{3}-\d{4}$ находит любую строку вида «123-4567», не зная заранее конкретных цифр. Regex одинаково используют для поиска, проверки формата (email, телефон, URL) и замены текста. Все три задачи умеет тестер выше.

Как пользоваться тестером

  1. Введите шаблон в поле «Регулярное выражение», без слэшей по краям.
  2. Вставьте текст для проверки, совпадения подсветятся сразу по мере ввода.
  3. Включайте флаги под полем шаблона, чтобы поменять поведение поиска.
  4. Кнопка «Копировать код» отдаёт готовый вызов на JavaScript, PHP или Python, язык выбирается наверху страницы.

Шпаргалка по синтаксису

Основные конструкции, из которых собирается любой шаблон.

СинтаксисЧто означает
\d \DЦифра [0-9] и всё, кроме цифры
\w \WБуква/цифра/подчёркивание и всё остальное
\s \SПробельный символ и всё, кроме него
.Любой символ, кроме переноса строки
^ $Начало и конец строки
\b \BГраница слова и её отсутствие
[abc] [^abc]Один символ из набора и один символ не из набора
(...)Группа захвата
(?:...)Группа без захвата
(?<name>...)Именованная группа захвата
a|bАльтернатива, то есть a или b

Квантификаторы: сколько раз повторить

Квантификатор ставится сразу после символа или группы и задаёт, сколько раз он может повториться.

КвантификаторЧто означает
*0 или более повторений
+1 или более повторений
?0 или 1 повторение
{n}Ровно n повторений
{n,}n или более повторений
{n,m}От n до m повторений

Жадные и ленивые квантификаторы

По умолчанию квантификаторы «жадные», они захватывают максимально длинный кусок текста. Добавленный после них знак вопроса делает их «ленивыми», и тогда они останавливаются на первом же подходящем совпадении.

css
const text = '<b>жирный</b> и <b>ещё раз</b>'

text.match(/<b>.*<\/b>/)   // жадный: захватит от первого <b> до последнего </b>
text.match(/<b>.*?<\/b>/)  // ленивый: остановится на первом же </b>

Ленивые квантификаторы почти всегда нужны при разборе HTML-подобной разметки или любого текста с повторяющимися парными разделителями.

Группы захвата и именованные группы

Круглые скобки (...) группируют часть шаблона и заодно запоминают найденный фрагмент. Его можно достать из результата или подставить при замене как $1, $2 и так далее. Если запоминать фрагмент не нужно, скажем группа стоит только ради альтернативы a|b внутри более крупного шаблона, берите группу без захвата (?:...). Она не засоряет список совпадений.

css
const match = '2024-06-15'.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/)

match.groups.year   // '2024'
match.groups.month  // '06'
match.groups.day    // '15'

Именованная группа (?<name>...) решает ту же задачу, но обращаться к результату можно по имени, а не по номеру. Когда групп больше двух-трёх, код так читается заметно проще.

Просмотр вперёд и назад (lookahead / lookbehind)

Иногда нужно проверить, что рядом с совпадением есть (или нет) определённый текст, не включая его в само совпадение. Для этого есть четыре конструкции просмотра:

css
(?=...)   // впереди должно быть — «100(?=руб)» найдёт 100 перед «руб»
(?!...)   // впереди не должно быть
(?<=...)  // позади должно быть — «(?<=\$)\d+» найдёт число после знака $
(?<!...)  // позади не должно быть

Классический пример — найти цену без символа валюты. (?<=\$)\d+(\.\d{2})? находит «49.99» в строке «$49.99», не захватывая сам знак доллара.

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

Флаги меняют поведение всего шаблона целиком и указываются после закрывающего слэша (в JavaScript) или отдельным аргументом (в PHP и Python). В тестере выше их включают переключателями.

ФлагЧто делает
gНайти все совпадения, а не только первое
iНе учитывать регистр букв
m^ и $ работают на границах каждой строки, а не только всего текста
sТочка . дополнительно совпадает с переносом строки
uКорректная работа с Unicode: многобайтовыми символами и эмодзи

Regex в JavaScript, PHP и Python: чем отличаются

Ядро синтаксиса (классы символов, квантификаторы, группы) одинаково во всех трёх языках. Отличается обвязка. JavaScript пишет шаблон между слэшами (/regex/флаги), PHP оборачивает его в дополнительный разделитель-кавычку ('/regex/флаги'), а Python передаёт шаблон обычной строкой, а флаги отдельным аргументом функции. Именованные группы Python исторически писал как (?P<name>...), но синтаксис (?<name>...) из тестера тоже валиден. Переключатель языка наверху страницы меняет именно эту обвязку в кнопке «Копировать код», сам паттерн остаётся общим.

Короткая версия этой шпаргалки с живым тестером есть в статье «Регулярные выражения: как читать и составлять».

Проверить регулярное выражение прямо в рабочем коде поможет проверка синтаксиса JavaScript.

Похожие инструменты

Другие полезные инструменты из той же категории

Часто задаваемые вопросы

Тестер поддерживает JavaScript (ECMAScript), PHP (PCRE), Python (модуль re) и .NET regex, каждый со своим специфическим синтаксисом и функциями.

Общие флаги включают: g (глобальное совпадение всех), i (без учёта регистра), m (многострочный), s (dotall), u (unicode) и x (расширенный/подробный). Каждый тип может поддерживать разные флаги.

Инструмент включает распространённые предустановленные паттерны для email, URL, номеров телефонов и дат. Также можно создавать пользовательские паттерны с помощью интерактивного конструктора regex.

Да! Тестер выделяет все совпадения в вашем тестовом тексте и показывает группы захвата, упрощая визуализацию того, что ваш regex находит.

Жадные квантификаторы (*, +, ?) сопоставляют как можно больше, а нежадные (??, *?, +?) сопоставляют как можно меньше. Используйте нежадные для точного сопоставления между разделителями.