Как проверить регулярное выражение
- Введите регулярное выражение без косых черт вокруг:
\d+, а не/\d+/. - Укажите флаги в соседнем поле:
g— найти все совпадения,gi— ещё и без учёта регистра,gu— для работы с Юникодом и\p{…}. - Вставьте текст для проверки. Все совпадения подсвечиваются прямо в тексте, а таблица показывает каждое совпадение, его позицию и что захватила каждая группа.
- Проверьте замену: выберите Поиск и замена и напишите новый текст, используя
$1или$<name>для групп. Результат появится над совпадениями с кнопкой копирования. - Перенесите шаблон в код: в результатах он показан как литерал и как
new RegExp(…), где обратные косые черты уже удвоены для строки.
Если в шаблоне синтаксическая ошибка, вы увидите её описание простыми словами, способ исправить и исходное сообщение браузера.
Какой это диалект регулярных выражений
У регулярных выражений есть диалекты. Здесь шаблон выполняется движком JavaScript вашего браузера — V8 в Chrome, Edge и Яндекс Браузере, SpiderMonkey в Firefox, JavaScriptCore в Safari, — и все они следуют стандарту ECMAScript. Поэтому шаблон, который работает здесь, так же сработает в JavaScript, TypeScript и Node.js. Большая часть синтаксиса совпадает с PCRE (PHP), модулем re в Python, Java и .NET, но есть отличия:
| Возможность | JavaScript (этот тестер) | PCRE и Python |
|---|---|---|
Ретроспективная проверка (?<=…) (?<!…) | Есть, любой длины | Есть; в Python — только фиксированной длины |
| Именованные группы | (?<name>…), \k<name>, $<name> в замене | В Python (?P<name>…) и \g<name> |
Сверхжадные a++ и атомарные группы (?>…) | Нет | PCRE — да; Python — с версии 3.11 |
\d, \w, \b | Только ASCII даже с флагом u: кириллица в \w не входит | Python 3: цифры и буквы Юникода, включая кириллицу; PHP — с модификатором u |
Свойства Юникода \p{L}, \p{Script=Cyrillic} | С флагом u или v | PCRE — да; re в Python — нет |
$ в конце | Только в самом конце (или в конце каждой строки с m) | Ещё и перед последним переводом строки |
Встроенные флаги (?i) | Не для всего шаблона; новые браузеры понимают (?i:…) для части | Есть |
Без флага u или v JavaScript молча читает неизвестное экранирование как обычную букву: \A ищет «A», а \p{L} — текст «p{L}». Тестер предупреждает об обоих случаях.
Кириллица в регулярных выражениях
Русский текст — главный источник сюрпризов. Диапазон [а-я] берёт символы Юникода с U+0430 по U+044F, а буква ё стоит отдельно, на U+0451 (заглавная Ё — на U+0401, а не между Е и Ж). Поэтому [а-я] её пропускает, и слово «ёжик» разваливается. Вот что находят разные варианты в строке «Ёлка, ёжик и Елена» — результат посчитан этим же тестером:
| Шаблон | Флаги | Находит |
|---|---|---|
[а-я]+ | g | лка, жик, и, лена |
[а-яё]+ | gi | Ёлка, ёжик, и, Елена |
[а-яА-ЯёЁ]+ | g | Ёлка, ёжик, и, Елена |
\p{Script=Cyrillic}+ | gu | Ёлка, ёжик, и, Елена |
\w+ | g | ничего |
[а-яё]с флагом i — самый короткий надёжный вариант для русских букв. Без i пишите[а-яА-ЯёЁ].\p{Script=Cyrillic}берёт всю кириллицу, включая украинские і, ї, є и белорусскую ў, но работает только с флагом u (или v).\p{L}— любая буква любого алфавита.\wи\bв JavaScript — только ASCII.\w+на русском тексте не находит ничего, а\bкот\bне найдёт слово «кот» вообще: для движка русские буквы — не «буквы слова». Границу слова задайте проверками, как в шаблоне «Слово целиком» ниже.- Регистр: флаг i корректно сопоставляет «Ё» и «ё», «Я» и «я» — отдельной настройки локали не нужно.
Шпаргалка по регулярным выражениям
Символы и классы
| Синтаксис | Что означает |
|---|---|
. | Любой символ, кроме переноса строки (с флагом s — вообще любой) |
\d \D | Цифра 0–9 / всё остальное |
\w \W | Латинская буква, цифра или _ (A–Z, a–z, 0–9, _) / всё остальное |
\s \S | Пробел, табуляция, перенос строки (и неразрывный пробел) / всё остальное |
[абв] | Один из символов а, б или в |
[^абв] | Любой символ, кроме а, б и в |
[а-яё0-9] | Диапазон: строчная русская буква или цифра |
\p{L} \p{N} | Любая буква / цифра любого алфавита (флаг u или v) |
\. \* \\ | Точка, звёздочка, обратная косая черта буквально: экранируются . * + ? ^ $ ( ) [ ] { } | \ / |
Якоря
| Синтаксис | Что означает |
|---|---|
^ | Начало текста (каждой строки с флагом m) |
$ | Конец текста (каждой строки с флагом m) |
\b | Граница слова между \w и \W — только для латиницы |
\B | Не граница слова |
Квантификаторы
| Синтаксис | Что означает |
|---|---|
* | Ноль или больше раз |
+ | Один или больше раз |
? | Ноль или один раз (необязательно) |
{3} | Ровно 3 раза |
{2,5} | От 2 до 5 раз |
{2,} | 2 раза и больше |
*? +? ?? | Ленивые: как можно меньше раз вместо как можно больше |
Группы и проверки
| Синтаксис | Что означает |
|---|---|
(абв) | Захватывающая группа; номера идут с 1 по открывающим скобкам |
(?<name>абв) | Именованная группа |
(?:абв) | Группа без захвата |
\1 \k<name> | Тот же текст, что нашла группа 1 / именованная группа |
а|б | а или б |
(?=абв) (?!абв) | Дальше идёт абв / не идёт абв (опережающая проверка) |
(?<=абв) (?<!абв) | Перед этим стоит абв / не стоит абв (ретроспективная проверка) |
Замена
| Синтаксис | Что означает |
|---|---|
$1 $<name> | Текст группы 1 / именованной группы |
$& | Всё совпадение |
$` $' | Текст до / после совпадения |
$$ | Знак доллара |
Готовые шаблоны для русских данных
Скопируйте шаблон в поле и подстройте под себя. Последний столбец — что шаблон находит в примере; это посчитано кодом самого тестера.
| Что ищем | Шаблон | Флаги | В примере | Замечания |
|---|---|---|---|---|
| Телефон РФ | (?:\+7|8)[\s(-]*\d{3}[\s)-]*\d{3}[\s-]*\d{2}[\s-]*\d{2} | g | Звоните: +7 (495) 123-45-67 или 8 912 345 67 89. → +7 (495) 123-45-67, 8 912 345 67 89 | Номер с +7 или 8 и любыми скобками, пробелами и дефисами. Перед сохранением приведите к одному виду, например заменой \D на пустую строку. |
| ИНН | \b\d{10}(?:\d{2})?\b | g | ИНН организации 7707083893, ИП 500100732259. → 7707083893, 500100732259 | 10 цифр у организаций, 12 у физлиц и ИП. Контрольные цифры регулярным выражением не проверить — для этого нужен расчёт. |
| Почтовый индекс | \b\d{6}\b | g | 125009, Москва, ул. Тверская, д. 7 → 125009 | Ровно шесть цифр. Найдёт и любое другое шестизначное число, поэтому ищите рядом с адресом. |
| Госномер авто | [АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}\d{2,3} | g | Машина А123ВС77, вторая — Х777ХХ199. → А123ВС77, Х777ХХ199 | В номерах используются только 12 букв, похожих на латинские. Если номер набран латиницей (A123BC77), он не найдётся — частая ловушка. |
| Дата ДД.ММ.ГГГГ | \b(?:0[1-9]|[12]\d|3[01])\.(?:0[1-9]|1[0-2])\.\d{4}\b | g | Договор от 01.09.2026, акт от 32.13.2026. → 01.09.2026 | Проверяет, что день 01–31 и месяц 01–12, но не календарь: 30.02.2026 пройдёт. |
| Email (в том числе .рф) | [\p{L}\p{N}._%+-]+@[\p{L}\p{N}-]+(?:\.[\p{L}\p{N}-]+)+ | gu | Пишите на info@пример.рф или ivan.petrov@mail.ru. → info@пример.рф, ivan.petrov@mail.ru | Вариант с \w не находит кириллические домены, поэтому здесь \p{L} и флаг u. Полной проверки по RFC 5322 нет ни у одного практичного шаблона. |
| Слово целиком (кириллица) | (?<![\p{L}\p{N}_])кот(?![\p{L}\p{N}_]) | giu | Кот спит, котёнок играет, а кот Васька ест. → Кот, кот | \b не видит русских букв, поэтому границу слова задают ретроспективная и опережающая проверки. |
| Повтор слова | (?<![\p{L}])(\p{L}+)\s+\1(?![\p{L}]) | giu | Это было было давно, очень очень давно. → было было, очень очень | \1 повторяет то, что нашла группа 1; с флагом i поймает и «Было было». |
Пример: даты из ДД.ММ.ГГГГ в ISO
В поле уже стоит шаблон (?<day>\d{2})\.(?<month>\d{2})\.(?<year>\d{4}): он ищет даты в привычном русском формате «день.месяц.год». \d{2} — ровно две цифры, точка экранирована (\.), иначе она означала бы «любой символ», и каждая часть лежит в именованной группе. С флагом g он находит в тестовом тексте 3 даты: 16.10.2026 на позиции 22, 15.11.2026 на позиции 46, 30.09.2026 на позиции 77. Позиции считаются с нуля, так что позиция 22 значит, что перед совпадением 22 символа.
В режиме Поиск и замена замена $<year>-$<month>-$<day> переставляет части в формат ISO 8601, который понимают базы данных и сортировка по строке. Первая строка текста становится такой: «Счёт № 1042 выставлен 2026-10-16, оплатить до 2026-11-15.» Без флага g изменилась бы только первая дата.
Катастрофический возврат
Когда совпадение не находится, движок возвращается и пробует другие способы, которыми шаблон мог бы совпасть. Обычно их немного. Но повторение внутри повторения — (a+)+, (\w*)*, (а|аа)+ — делит один и тот же текст экспоненциальным числом способов. Проверка (a+)+$ на 30 буквах «a» с «!» в конце означает перебор примерно 230, то есть больше миллиарда вариантов, прежде чем движок сдастся; каждая лишняя «a» удваивает время.
Регулярное выражение в JavaScript нельзя прервать, поэтому во многих онлайн-тестерах такой шаблон вешает вкладку. Здесь он выполняется в отдельном фоновом потоке (Web Worker): через секунду тестер его останавливает, объясняет причину и показывает вложенное повторение, если находит его. Исправление — сделать так, чтобы каждый кусок текста совпадал только одним способом: a+$ вместо (a+)+$ или класс без разделителя, например [^;]* вместо .*. На сервере такой шаблон — риск отказа в обслуживании (ReDoS), так что его стоит исправить, а не просто обходить.
Советы и ограничения
- Позиции считаются в кодовых единицах UTF-16, как индексы строк в JavaScript: русская буква — одна единица, большинство эмодзи — две. С флагом u точка берёт эмодзи как один символ.
- Без флага g находится и заменяется только первое совпадение. Флаг y («липкий») ищет только с текущей позиции, поэтому каждое совпадение должно начинаться там, где закончилось предыдущее.
- Тестер перечисляет до 10 000 совпадений, показывает первые 1000 в таблице и подсвечивает первые 100 000 символов текста.
- Для проверки поля формы целиком оберните шаблон в
^…$: без якорей он совпадёт и с частью длинного текста. В атрибутеpatternу<input>якоря подставляются сами, а браузер применяет флаг v. - Проверить JSON, который вы вытащили шаблоном, можно в форматировании JSON; поменять регистр найденного — инструментом изменения регистра.
Конфиденциальность
Поиск выполняется в вашем браузере. Шаблон и текст никуда не загружаются и не записываются в логи. Страница помнит последние введённые данные на этом устройстве, чтобы они были на месте, когда вы вернётесь, а кнопка Копировать ссылку кладёт их после знака # в ссылке — эту часть браузер никогда не отправляет на сервер.
Частые вопросы
Какой диалект регулярных выражений использует тестер?
JavaScript — по стандарту ECMAScript, встроенный в каждый браузер. Шаблоны ведут себя ровно так же, как в JavaScript, TypeScript и Node.js. Для PHP, Python или Java почти весь синтаксис тот же; отличия перечислены выше.
Почему [а-я] не находит букву ё?
В Юникоде строчные русские буквы от «а» до «я» идут подряд (U+0430–U+044F), а «ё» стоит отдельно — U+0451, заглавная «Ё» — U+0401. Диапазон её не включает. Пишите [а-яё] с флагом i или [а-яА-ЯёЁ], а для всей кириллицы — \p{Script=Cyrillic} с флагом u.
Почему \w и \b не работают с русским текстом?
В JavaScript \w — это только A–Z, a–z, 0–9 и _, даже с флагом u, а \b определяется через \w. Для русских слов используйте [а-яё] или \p{L}, а границу слова задавайте проверками: (?<![\p{L}\p{N}_])слово(?![\p{L}\p{N}_]) с флагом u.
Почему шаблон работает в Python или PHP, а здесь — нет?
Обычно из-за синтаксиса, которого нет в JavaScript: (?P<name>…), сверхжадные квантификаторы вроде a++, атомарные группы, (?i) в начале, \A и \Z. Сообщение об ошибке называет проблему, а для синтаксиса Python и PCRE показывает, как написать то же на JavaScript.
Чем жадный квантификатор отличается от ленивого?
Жадный, например .*, забирает как можно больше текста, поэтому <.*> на <b>привет</b> захватит всю строку. Знак ? делает его ленивым: <.*?> остановится на первой > и найдёт <b>.
Откуда пустые совпадения?
Шаблон, который может совпасть с пустой строкой, — \d*, x? — срабатывает и между символами. Тестер отмечает пустые совпадения тонкой красной чертой. Если нужен хотя бы один символ, пишите + вместо *.
Обновлено: 16 октября 2026 г.