Skip to content

Бесплатный тестер regex — отладка совпадений онлайн

Тестируйте регулярные выражения мгновенно на любом тексте. Подсветка совпадений, группы захвата, предпросмотр замены, разбиение и пояснение. Regex в стиле JavaScript, бесплатно, конфиденциально, без регистрации.

Без отслеживания Работает в браузере Бесплатно
Всё тестирование происходит локально в вашем браузере. Ваш шаблон и текст никогда не покидают это устройство.
Флаги
Подсвеченные совпадения
Совпадения и группы захвата
Проверено на верность ECMA-262, корректность групп захвата (с флагом /d и без), паритет шаблонов замены со String.prototype.replace, устойчивость к ReDoS через бюджетирование «настенных часов» и доступность (ARIA-роли, объявления совпадений для screen reader, обработка RTL/LTR). — Команда инструментов работы с текстом Go Tools · May 21, 2026

Наша команда сверяет вывод regex со спецификацией ECMA-262, поведением RegExp в Node.js и cross-engine тестами паритета в V8 / JavaScriptCore / SpiderMonkey. Бюджет ReDoS откалиброван относительно задокументированных worst-case шаблонов из корпусов regex-DoS Snort и OWASP.

Что такое тестер regex?

Тестер regex (тестер регулярных выражений) — это инструмент, который позволяет написать regex-шаблон, вставить кусок тестового текста и точно увидеть, с чем шаблон совпадает — с группами захвата, предпросмотром замены и разбором флагов — без перекомпиляции кода или запуска скрипта. Для разработчиков он сокращает цикл с минут до миллисекунд: подправил шаблон, посмотрел, как сдвинулась подсветка, отгрузил regex с уверенностью.

Регулярное выражение — это компактный язык для описания текстовых шаблонов. \d+ совпадает с одной или более цифрой. [A-Za-z_]\w* совпадает с типичным идентификатором. (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) совпадает с ISO-датой и именует каждую часть. Регулярные выражения — это хребет поиска и замены в каждом редакторе кода, валидации в каждой форме, парсинга логов в каждом стеке наблюдаемости и grep, sed, awk — Unix-инструментов, на которых работает половина интернета. И их же печально известно сложно писать правильно: квантификатор на единицу, не туда поставленный escape могут совпасть с не той подстрокой, полностью промахнуться или — в худшем случае — спровоцировать катастрофический бэктрекинг, который возьмёт ядро CPU в заложники. Хороший тестер regex ловит каждый из этих режимов отказа до того, как они попадут в продакшен.

Этот тестер запускает нативный движок RegExp ECMA-262, поставляющийся с каждым современным браузером — тот же движок, что вы зовёте из JavaScript, TypeScript, Node.js, Deno или Bun. Это значит: группы захвата (нумерованные и именованные через (?<name>...)), look-ahead и look-behind утверждения ((?=...), (?!...), (?<=...), (?<!...)), семь канонических флагов (g, i, m, s, u, y, d), escape-последовательности свойств Unicode (\p{Letter}, \p{Script=Han}) под /u и character escape вроде \d. Шаблоны, провалидированные здесь, вставляются прямо в кодовую базу и работают без изменений. Если вы портируете из PCRE, Python или Java, пояснитель разбирает каждый токен, чтобы вы могли заметить синтаксис, который не переносится (атомные группы, поссессивные квантификаторы, встроенные модификаторы).

Что тестер показывает помимо сырых совпадений: панель «Совпадения и группы захвата» перечисляет каждое совпадение со смещениями [start, end) и значением каждой группы захвата — ту же информацию, что вы получили бы от String.prototype.matchAll с флагом /d, но разложенную под визуальный просмотр. Вкладка Replace показывает живой предпросмотр подстановки, поддерживающий весь алфавит шаблонов $1 / $& / $` / $' / $$ / $<name> — ровно то, что принимает String.replace в JavaScript. Вкладка Split применяет String.split с regex и показывает каждую часть. Вкладка Explain токенизирует шаблон и аннотирует каждый кусок простым языком — полезно для code review, обучения и переноса между диалектами.

По части конфиденциальности: каждая операция локальна. Ваш шаблон и тестовый текст никогда не покидают страницу — они не логируются, не отправляются в аналитический сервис, не сохраняются на диск. В localStorage сохраняются только ваши UI-настройки (активная вкладка и какие флаги вы обычно держите включёнными). Это делает инструмент безопасным для отредактированных образцов логов, проприетарных шаблонов, внутренней конфигурации и шаблонов, содержащих подсказки о схеме ваших данных. По сравнению с тестерами на серверной поддержке вроде regex101 история приватности и латентности строго лучше; компромисс — поддержка только одного диалекта (только JavaScript).

Если вы новичок в regex, выпадающий список «Распространённые шаблоны» поставляется с проверенными стартерами: email-адрес, URL, IPv4, UUID, hex-цвет, ISO-дата, телефонный номер США и шаблон срезания концевых пробелов. Загрузите один, понаблюдайте за совпадениями на предложенном образце текста, потом мутируйте шаблон по одному символу, чтобы прочувствовать, как откликается движок. Сочетайте это с инструментом Text Diff, когда хотите сравнить до/после очистки на основе regex, с JSON Formatter, когда ваш ввод или ожидаемый вывод — JSON, или с URL-кодировщиком, когда строки, с которыми вы совпадаете, URL-закодированы.

// The pattern you build in this tester drops straight into JavaScript.
// Example: extract every ISO date from a string with named groups.

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g;
const text = 'shipped 2026-05-21, scheduled 2026-06-30';

for (const m of text.matchAll(pattern)) {
  console.log(m.groups.year, m.groups.month, m.groups.day);
  // → 2026 05 21
  // → 2026 06 30
}

// Same regex, used in a replace with $<name> templates:
text.replace(pattern, '$<day>/$<month>/$<year>');
// → 'shipped 21/05/2026, scheduled 30/06/2026'

// With the /d flag, every match carries [start, end] indices
// per capture group — the Matches panel uses this to paint offsets.
const p2 = /(?<year>\d{4})-(?<month>\d{2})/gd;
const m = [...text.matchAll(p2)][0];
m.indices.groups.year; // [8, 12]

Ключевые возможности

Подсветка совпадений в реальном времени

Каждое совпадение в тестовом тексте загорается в тот момент, как ваш шаблон распарсился. Чередующиеся цвета позволяют легко считать соседние совпадения визуально, а бейдж счётчика над результатом сообщает точный итог — без кнопки Run, без задержки debounce свыше 200мс.

Боковая панель групп захвата

Панель «Совпадения и группы захвата» справа перечисляет каждое совпадение как карточку со смещениями [start, end), полным текстом совпадения и каждой позиционной и именованной группой захвата внутри. Именованные группы помечают себя как $<name>, чтобы вы читали данные так же, как будете потреблять их в коде.

Живой предпросмотр Replace с $1 / $& / $<name>

Переключитесь на вкладку Replace, чтобы увидеть вашу подстановку, применённую в реальном времени. Работает полный алфавит замен ECMAScript: $1..$N для позиционных, $<name> для именованных, $& для всего совпадения, $` и $' для префикса/суффикса, $$ для литерального доллара. Панели ввода и вывода бок о бок с копированием в один клик.

Разбиение по границам regex

Вкладка Split вызывает String.prototype.split с вашим regex и показывает каждую часть как нумерованный список. Пустые части отрисовываются глифом ⏎, чтобы вы видели, как движок обработал соседние разделители — полезно для отладки чистки CSV-подобного ввода.

Пояснитель шаблона (токен за токеном)

Вкладка Explain токенизирует ваш шаблон в чипсы, окрашенные по классу (escape / квантификатор / класс символов / группа / якорь / альтернация) и аннотирует каждый чипс однострочным описанием. Прочитайте свой regex самому себе перед отгрузкой; используйте для code review или обучения.

ReDoS-безопасность (тайм-аут по «настенным часам»)

Каждый вызов match обёрнут в бюджет 250 миллисекунд. Классические формы катастрофического бэктрекинга вроде (a+)+, (a|aa)+b и глубоко вложенные квантификаторы чисто прерываются с предупреждением «Шаблон превысил тайм-аут» — страница остаётся отзывчивой вместо блокировки вкладки. Обнаружение без серверной песочницы.

Библиотека распространённых шаблонов

Проверенные стартеры для восьми шаблонов, к которым разработчики тянутся чаще всего: email, URL, IPv4, UUID v4, hex-цвет, ISO-дата, телефонный номер США и срезание концевых пробелов. Каждый загружается с подходящим образцом, чтобы вы увидели regex в работе перед тем, как адаптировать.

Постоянные ссылки (без загрузки)

«Скопировать ссылку» кодирует шаблон + флаги + образец текста в хэш URL (#p=…&f=gim&t=…). Браузеры никогда не передают фрагменты URL в запросах, поэтому общая ссылка воспроизводит ваше состояние на машине получателя, не касаясь серверов go-tools.org. Самодостаточно, дружелюбно к аудиту.

Конфиденциальность 100% в браузере

Ваш regex и тестовый текст никогда не покидают устройство. Без сетевых запросов, без логирования, без аналитики того, что вы вводите. Проверьте в DevTools → Network: ноль запросов при вводе. Безопасно для проприетарных шаблонов, отредактированных логов и любого текста, который вы не вставили бы в regex101.

Проработанные примеры

Извлечь все email-адреса из абзаца

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g

Вставьте шаблон с включённым флагом /g, бросьте абзац в поле тестового текста — и каждый email загорится в подсвеченном виде. Панель «Совпадения и группы захвата» справа перечислит каждый адрес со смещениями [start, end) — пригодится, когда тот же regex уйдёт в grep, sed или редактор кода.

Захватить части даты именованными группами

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g

Именованные группы ECMA-262 появляются в правой панели как $<year>, $<month>, $<day>. Переключитесь на вкладку Replace и попробуйте $<day>/$<month>/$<year>, чтобы переформатировать ISO-даты в DMY одним проходом — тот же трюк работает в любом современном JS-вызове replace.

Поиск и замена с обратными ссылками $1

(\w+) (\w+)
Замена: $2, $1   →   Jack Doe → Doe, Jack

Две неименованные группы захвата, шаблон замены $2, $1, и вкладка Replace даёт живой предпросмотр. $&, $`, $', $$ и $<name> — всё поддерживается, ровно тот алфавит подстановки из спецификации ECMAScript, что вы скопируете, тот и запустится без изменений в любом JS-движке.

Срезать концевые пробелы построчно

[ \t]+$
/[ \t]+$/gm

Скомбинируйте флаги /g (глобальный) и /m (многострочный), чтобы $ цеплялся к каждому концу строки, а не только к концу ввода. Вкладка Replace с пустой заменой показывает чистый diff: концевые табы и пробелы исчезают, проза остаётся на месте. Тот же regex с выключенным /s (dotAll) не даёт точке пересекать переводы строк.

Обнаружить катастрофический бэктрекинг и пережить его

(a+)+b
Тестовый текст: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac

Вложенные квантификаторы + образуют классический ReDoS-шаблон. В наивном тестере это вешает вкладку. Здесь сторож по «настенным часам» срабатывает после 250мс, появляется баннер «Шаблон превысил тайм-аут», а страница остаётся отзывчивой. Заякорите шаблон, переключитесь на непересекающуюся альтернацию или используйте атомные идиомы — и протестируйте заново.

Разбить CSV-подобную строку по смешанным разделителям

[,;|]\s*
alpha, beta; gamma | delta → ["alpha", "beta", "gamma", "delta"]

Переключитесь на вкладку Split. Любая запятая, точка с запятой или вертикальная черта (с необязательным пробелом после) становится границей части. Удобно для чистки скопированных списков тегов, нормализации пользовательского ввода или предобработки полей лога перед настоящим CSV-парсером — посмотрите CSV to JSON, когда данные действительно по RFC 4180.

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

  1. 1

    Введите шаблон между слэшами

    Бросьте любое регулярное выражение ECMA-262 в поле /…/. Плохие шаблоны подсвечиваются красным с сообщением парсера; валидные шаблоны идут на живой матчинг.

  2. 2

    Переключите нужные флаги

    g (global), i (case-insensitive), m (multiline), s (dotAll), u (unicode), y (sticky), d (indices). Каждый чипс загорается, когда включён; индикатор справа от шаблона показывает канонический литерал.

  3. 3

    Вставьте тестовый текст

    Совпадения подсвечиваются чередующимися цветами по мере ввода. Панель «Совпадения и группы захвата» справа перечисляет каждое совпадение со смещениями [start, end) и значением каждой группы захвата (именованные группы помечены как $<name>).

  4. 4

    Переключайтесь между вкладками Replace, Split и Explain

    Replace предпросматривает шаблон подстановки рядом с вводом. Split режет по каждой границе совпадения. Explain разбирает шаблон токен за токеном с описанием простым языком для каждого элемента.

  5. 5

    Скопируйте литерал или поделитесь постоянной ссылкой

    «Скопировать /pattern/flags» бросает канонический regex-литерал в буфер обмена для прямого использования в JavaScript / TypeScript / Node. «Скопировать ссылку» кодирует полное состояние в URL-хэш (без загрузки), чтобы коллега мог воспроизвести его локально.

Типичные ошибки в regex

Забыли флаг /g и получили только одно совпадение

Без /g (или /y) движок останавливается после первого совпадения. Методы match, matchAll, replace и split все ведут себя по-разному вокруг глобального флага. Переключите /g и перезапустите; счётчик над результатами прыгнет с 1 до N.

✗ Неверно
Шаблон: /\d+/  →  '1 22 333' даёт только ['1']
✓ Верно
Шаблон: /\d+/g  →  '1 22 333' даёт ['1', '22', '333']

Жадный квантификатор съел слишком много

.+ потребляет как можно больше, поэтому <.+> на <a> and <b> захватывает <a> and <b>, а не <a>. Используйте ленивые квантификаторы (.+?), более ограничивающие классы символов ([^>]+) или заякорьте через look-around.

✗ Неверно
Шаблон: /<.+>/  →  совпадает с '<a> and <b>'
✓ Верно
Шаблон: /<[^>]+>/  →  совпадает с '<a>' и '<b>' раздельно

Катастрофический бэктрекинг от вложенных квантификаторов

(a+)+b на длинной проваливающейся строке взрывается экспоненциально. Баннер «Шаблон превысил тайм-аут» срабатывает после 250мс; перепишите так, чтобы убрать вложенность: a+b делает ту же работу за линейное время. Имитация атомной группы (?=(a+))\1b — другой вариант.

✗ Неверно
Шаблон: /(a+)+b/  на 'aaaaaaaaaaaaaaaaaaaaac'  →  тайм-аут
✓ Верно
Шаблон: /a+b/  на том же вводе  →  мгновенный 'no match'

Якоря $ и ^ не ведут себя как \A и \Z в Python

В JavaScript ^ и $ означают начало/конец строки ТОЛЬКО при включённом /m; иначе они означают начало/конец строки ввода. \A и \Z из Python (которые всегда означают границы строки ввода) в JS не существуют. Переключайте /m по необходимости.

✗ Неверно
Шаблон: /^Error/  на многострочном логе без /m  →  совпадает только с первой строкой
✓ Верно
Шаблон: /^Error/m  на том же вводе  →  совпадает с каждой строкой, начинающейся с Error

Использовали $1 в строке, но вызвали replace с функцией

text.replace(re, '$1') раскрывает обратную ссылку. text.replace(re, () => '$1') передаёт литеральную строку '$1', потому что функции не видят токены шаблонов. Внутри функции группы захвата приходят как позиционные аргументы.

✗ Неверно
text.replace(/(\w+)/, m => '$1')  →  даёт литеральный '$1'
✓ Верно
text.replace(/(\w+)/, (_, g1) => g1.toUpperCase())  →  использует захват

Символы Unicode не совпадают с \w или .

По умолчанию \w — это [A-Za-z0-9_]. Чтобы совпасть с каждой буквой в каждой письменности, включите /u и переключитесь на \p{Letter} (\p{L}). Точка также по умолчанию останавливается на переводах строк — используйте /s (dotAll), когда хотите настоящий «любой символ».

✗ Неверно
Шаблон: /\w+/  совпадает с 'hello', но не с 'héllo' и не с '你好'
✓ Верно
Шаблон: /\p{Letter}+/u  совпадает со всеми тремя

Вставили PCRE-шаблон; получили SyntaxError

JavaScript не поддерживает атомные группы (?>...), поссессивные квантификаторы a++, встроенные модификаторы (?i), условные конструкции (?(1)yes|no) или \A / \Z. Ошибка парсера называет виновную конструкцию — перепишите на JS-поддерживаемый эквивалент (имитация look-around, отдельное переключение флага, альтернация).

✗ Неверно
Шаблон: (?i)foo  →  SyntaxError: invalid group
✓ Верно
Шаблон: foo с включённым флагом /i  →  тот же эффект

Кто пользуется этим инструментом

Валидировать ввод форм перед отгрузкой
Подтвердите, что ваш regex для email / телефона / индекса / username совпадает с тем, что вы ожидаете — и отвергает то, что не ожидаете — по крайним случаям (Unicode-имена, plus-aliasing, международные форматы) до того, как валидация попадёт в продакшен и оттолкнёт реальных пользователей.
Извлекать данные из логов и конфигов
Постройте шаблон, который вытаскивает request ID, статус-коды, латентность или строки stack-trace из произвольного куска лога. Именованные группы делают данные самодокументируемыми; панель Совпадений показывает смещения, чтобы потом пустить тот же regex в rg --replace или grep -oE.
Поиск и замена по кодовой базе
Набросайте refactor-шаблон (напр. (\w+)\.apply\(null,\s*\[(.*?)\]\)$1($2)) здесь, предпросмотрите подстановку на репрезентативных сниппетах, потом вставьте провалидированный regex в проектный find/replace вашего редактора с уверенностью.
Проверить шаблон, найденный в интернете
Вставили regex со StackOverflow или из блога? Бросьте его во вкладку Explain — каждый токен будет аннотирован простым языком. Ловит тонкие проблемы (.+? там, где хотелось .+, пропущенные якоря ^/$, случайно жадные квантификаторы) до того, как regex попадёт в код.
Научить regex коллегу по команде
Откройте вкладку Explain на рабочем шаблоне и пройдите по нему токен за токеном. Цветовая кодировка (escape / квантификатор / класс символов / группа / якорь / альтернация) позволяет обучающемуся увидеть структурную форму regex, а не только символы.
Портировать шаблон между языками
Есть regex из Python или PCRE, который нужно использовать в JavaScript? Вставьте его сюда. Если он распарсится, пояснитель покажет JS-эквивалентную семантику; если нет, ошибка парсера назовёт виновную конструкцию (атомные группы, поссессивные квантификаторы, встроенный (?i)), чтобы вы точно знали, что переписать.
Отладить медленный продакшен-regex
Если серверный regex подозревается в катастрофическом бэктрекинге, вставьте его в этот тестер с образцом ввода. Сторож «настенных часов» в 250мс срабатывает на патологических случаях, давая немедленный диагноз ещё до того, как вы потянулись за инструментами профилирования — а пояснитель указывает на вложенный квантификатор как корневую причину.

Заметки о движке и алгоритме

Движок RegExp ECMA-262 (нативный браузерный)
Использует new RegExp(pattern, flags) и движок, поставляющийся с V8 / JavaScriptCore / SpiderMonkey — ту же семантику regex, что вы получите в JavaScript где угодно. Шаблоны, валидирующиеся здесь, работают без изменений в Node.js, Deno, Bun и каждом современном браузере.
Итерация совпадений через String.matchAll
Глобальная итерация использует text.matchAll(regex), а не ручной цикл по lastIndex, поэтому каждое совпадение несёт свои группы захвата, именованные группы и (с /d) индексы [start, end]. Нулевой ширины совпадения обрабатываются стандартным сдвигом lastIndex на +1, чтобы избежать бесконечных циклов.
Тайм-аут «настенных часов» для защиты от ReDoS
Бюджет 250 миллисекунд оборачивает каждый вызов match, replace и split. Движок всё ещё может бэктрекать внутри одной попытки совпадения, но внешняя итерация кооперирует с бюджетом — патологические шаблоны прерываются с timedOut: true, и UI выводит предупреждение вместо блокировки вкладки.
Переподмена шаблонов замены вручную
Вкладка Replace парсит $1..$N, $&, $, $', $$ и $<name> вручную, а не делегирует String.replace`, так что предпросмотр ведёт себя одинаково на разных движках (старее Safari, старее Node), где у шаблонов именованных групп есть крайние случаи. Вывод ровно тот, что выдают текущие движки JavaScript.
Токенайзер шаблона для пояснителя
Вкладка Explain запускает рукописный токенайзер, классифицирующий каждый фрагмент шаблона (escape / метасимвол / квантификатор / класс символов / открытие-группы / закрытие-группы / якорь / альтернация). Незнакомые конструкции проваливаются в literal с общим примечанием, так что пояснитель никогда не теряет содержимое молча.
Постоянные ссылки через хэш URL (никогда не передаются)
Состояние шеринга кодируется во фрагменте location.hash (#p=…&f=…&t=…&tab=…). Браузеры никогда не передают фрагмент в HTTP-запросах, поэтому серверы go-tools.org получают ноль данных при открытии постоянной ссылки. Гидратация происходит целиком на устройстве получателя.

Лучшие практики regex

Заякоривайте шаблоны, когда это намеренно
^pattern$ совпадает с точной строкой; pattern совпадает где угодно. Неправильный выбор — самый частый баг в валидации форм: пропущенный ^ пропустит ведущий attacker.com/ мимо проверки домена; пропущенный $ пропустит концевой мусор. Используйте вкладку Match на намеренно сломанных образцах, чтобы подтвердить, что отвергается.
Предпочитайте не-захватывающие группы для чистой структуры
(?:foo|bar)+ и (foo|bar)+ функционально идентичны, но первый не выделяет группу захвата. Тянитесь к (?:…), когда группа существует только под квантификатор или альтернацию — это сохраняет ваши нумерованные $1..$N стабильными и экономит крошечный объём работы движка.
Используйте флаг /u для всего, что выходит за ASCII
Без /u точка и \w трактуют символы из суррогатных пар (эмодзи, кодовые точки вне BMP) как две единицы UTF-16. С /u они — одна кодовая точка каждый — то, как их воспримут ваши пользователи. /u также включает \p{Letter} и другие escape-последовательности свойств. По умолчанию используйте /u для новых шаблонов, если у вас нет конкретной причины не делать этого.
Именуйте свои группы захвата
(?<year>\d{4})-(?<month>\d{2}) самодокументирующийся. Через шесть месяцев, когда вы читаете regex обратно, m.groups.year очевидно год — m[1] нет. Шаблоны замен с $<name> переживают переупорядочивание групп: позиционные шаблоны ломаются в момент, когда кто-то добавляет ещё одну группу.
Тестируйте случаи провала, не только успеха
Тестер regex — для провалов. Подтвердите, с чем шаблон совпадает, потом намеренно мутируйте тестовый текст, чтобы увидеть, с чем не совпадает — ведущий пробел, концевой пробел, пропущенные части, лишние части, неверный регистр, смешанные письменности. Шаблоны, проходящие валидный ввод, но принимающие мусор — это баги, которые продакшен показывает первыми.

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

Передаётся ли мой regex или тестовый текст на ваш сервер?
Нет. Каждая операция — match, replace, split и explain — выполняется на JavaScript внутри вашего браузера на нативном движке RegExp. Ваш шаблон и текст не загружаются, не логируются, не сохраняются на диск и не отправляются третьим сторонам. В localStorage сохраняются только UI-настройки (активная вкладка и какие флаги вы обычно держите включёнными), чтобы страница помнила их при следующем визите — никогда не шаблон и не тестовый текст. Проверить можно, открыв DevTools → Network: ввод в любое поле не вызывает ни одного запроса. Это делает инструмент безопасным для проприетарных шаблонов, отредактированных образцов логов, внутренней конфигурации и всего того, что вы не вставили бы в regex101.
Какой диалект regex использует этот тестер — PCRE, Python, Java, JavaScript?
ECMA-262 (JavaScript), диалект, реализованный в V8, JavaScriptCore и SpiderMonkey — тот же движок, что и в new RegExp(pattern, flags) в любом браузере, Node.js, Deno или Bun. Это значит, что поддерживаются: группы захвата (нумерованные и именованные через (?<name>...)), look-ahead (?=...) и (?!...), look-behind (?<=...) и (?<!...), семь флагов g/i/m/s/u/y/d, escape-последовательности свойств Unicode (\p{Letter}) под /u и обратные ссылки \1..\9. PCRE-специфичные фичи вроде атомных групп (?>...), поссессивных квантификаторов a++, условных конструкций (?(1)yes|no) и встроенных модификаторов (?i) выбросят синтаксическую ошибку. re.VERBOSE из Python здесь не поддерживается. Для regex Python/Java/Go портируйте шаблон обратно в нативный движок — большинство простых шаблонов переносится без изменений, а пояснитель здесь нейтрален относительно диалекта.
Что делает каждый из флагов g, i, m, s, u, y, d?
g (global) — находит каждое совпадение, а не только первое; требуется для итерации через .matchAll и для глобальной замены. i (case-insensitive) — A и a совпадают как одна буква. m (multiline) — ^ и $ цепляются к каждому переводу строки, а не только к началу/концу всего ввода. s (dotAll) — . совпадает и с переводами строк; без /s точка останавливается на \n. u (unicode) — включает escape-последовательности \u{HHHH}, escape-последовательности свойств Unicode (\p{Letter}) и трактует шаблон как последовательность кодовых точек Unicode вместо кодовых единиц UTF-16. y (sticky) — заякоривает каждое совпадение по lastIndex, полезно для токенайзеров. d (hasIndices, ES2022) — заполняет .indices и .indices.groups парами [start, end] для каждого захвата; этот тестер использует /d под капотом, чтобы рисовать границы групп. Переключайте их чипсами над тестовым текстом; канонический литерал /pattern/flags показан в индикаторе.
Как написать группы захвата и как на них ссылаться обратно?
Оберните подшаблон в скобки: (\d{4})-(\d{2})-(\d{2}) даёт три позиционные группы, доступные как $1, $2, $3 в заменах или как m.groups[0..2] в панели Совпадений. Используйте (?<name>...) для именованных групп: (?<year>\d{4})-(?<month>\d{2}) позволит писать $<year>/$<month> в шаблоне замены. Используйте (?:...) для не-захватывающей группы, когда группировка нужна только под квантификатор ((?:foo|bar)+) — она не создаёт обратной ссылки, что сохраняет ваши нумерованные $1..$N стабильными. Внутри того же шаблона ссылайтесь на предыдущий захват через \1, \2 и т.д. — удобно для поиска удвоенных слов вроде \b(\w+)\s+\1\b.
Как работают look-ahead и look-behind и для чего они нужны?
Lookarounds — это утверждения нулевой ширины: они проверяют, что что-то совпадает (или нет), не потребляя символы. (?=foo) (позитивный look-ahead) успешен, если foo идёт после текущей позиции; (?!foo) (негативный look-ahead) успешен, если foo НЕ идёт после. (?<=foo) и (?<!foo) — это look-behind-аналоги. Практическое применение: извлечение подстроки без захвата окружения ((?<=\$)\d+ совпадает с цифрами после знака доллара, но $ не часть совпадения), валидация с несколькими ограничениями в одном шаблоне ((?=.*[A-Z])(?=.*\d).{8,} требует хотя бы одну заглавную, одну цифру и 8 символов) и запрет вхождений (^(?!.*\bpassword\b) отклоняет любую строку, содержащую слово password). Современный ECMA-262 поддерживает look-behind переменной длины, так что (?<=^prefix-?) работает.
Почему мой regex вешает браузер и что такое катастрофический бэктрекинг?
Катастрофический бэктрекинг случается, когда у шаблона вложенные квантификаторы по пересекающимся альтернативам — классическая форма (a+)+, (a|aa)+, (\w*)* или (?:a|a?)+. На вводе, где совпадение может провалиться на последнем символе, движок перебирает экспоненциальное число разбиений по группам, прежде чем сдаться. На aaaaaaaaaaaaaaaaaaaaab с шаблоном (a+)+b это 2^21 ≈ 2 миллиона бэктреков до ответа. Этот тестер оборачивает каждый вызов match в бюджет «настенных часов» на 250мс — если бюджет превышен, итерация останавливается и вы видите предупреждение «Шаблон превысил тайм-аут». Лечится так: заякорите шаблон по границам (^...$), предпочитайте непересекающиеся альтернативы ((a|b) вместо (a|aa)), разверните вложенные квантификаторы (a+ вместо (a+)+) или перепишите через поссессивно-подобные идиомы ((?=(a+))\1 имитирует a++ в JS).
Чем этот тестер regex отличается от regex101.com?
Три отличия. (1) Конфиденциальность: regex101 отправляет каждое нажатие на сервер для бэкенд-оценки и хранит шаблоны в общедоступных ссылках; этот инструмент работает полностью в вашем браузере, без сетевых вызовов. (2) Скорость: серверный roundtrip на каждое изменение добавляет 80-300мс; здесь совпадения обновляются менее чем за 10мс даже на длинном тексте. (3) Фокус по диалекту: regex101 поддерживает PCRE, Python, Java, .NET, JavaScript, Rust и Go с UI флагов фич; этот инструмент сфокусирован на ECMA-262 (JavaScript) — диалекте, который поставляется с каждым браузером, Node, Deno и Bun, — а пояснитель и постоянные ссылки подстроены под этот единственный диалект. Если вам нужны PCRE-специфичные фичи, regex101 всё ещё правильный инструмент; для работы на JavaScript / TypeScript этот быстрее и приватнее. Постоянные ссылки здесь — это URL-хэши (без загрузки), поэтому общая ссылка воспроизводит ваш шаблон локально на машине получателя.
Как экранировать спецсимволы вроде . | ( ) [ ] { } * + ? ^ $ \?
Поставьте перед ними обратный слэш: \., \|, \(, \), \[, \], \{, \}, \*, \+, \?, \^, \$, \\. Прямой слэш / не нуждается в экранировании в строковом шаблоне (только в JS regex-литералах между слэшами). Внутри класса символов [...] большинство метасимволов теряет специальное значение, поэтому [.], [*], [+] все совпадают с литеральным символом — особыми остаются только ], \, ^ (только в начале — для отрицания) и - (диапазон между двумя символами). Если сомневаетесь, вставьте литеральный текст в шаблон и запустите пояснитель: каждая escape-последовательность получит однострочное описание в панели разбора.
Можно ли поделиться regex с коллегой по ссылке?
Да — и в ссылке нет серверного roundtrip. Нажмите «Скопировать ссылку» в панели действий: тестер закодирует ваш шаблон, флаги, тестовый текст и активную вкладку в хэш URL (#p=...&f=gim&t=...&tab=match). Любой, кто откроет ссылку, гидратирует страницу с тем же состоянием — локально на своей машине. Поскольку данные живут во фрагменте хэша, они никогда не отправляются на сервер go-tools.org (браузеры не передают фрагменты в запросах) и не логируются в наших журналах доступа. Длина ссылки растёт вместе с размером текста, поэтому для образцов >2КБ копируйте regex через «Скопировать /pattern/flags» и вставляйте текст отдельно. Для совместного review regex без передачи самого текста делитесь только шаблоном и флагами — получатель вставит свой корпус и получит те же совпадения.
Поддерживает ли тестер Unicode, эмодзи и нелатинские письменности?
Да. Включите флаг /u, чтобы перейти на полную обработку Unicode: \w совпадает с латинскими word-символами (семантика по умолчанию), но с /u можно совпадать с более широкими категориями через escape-последовательности свойств Unicode — \p{Letter} совпадает с каждой буквой в каждой письменности, \p{Script=Han} совпадает с китайскими иероглифами, \p{Emoji} совпадает с эмодзи, \p{Number} совпадает с каждой цифрой/числом. Без /u эмодзи из суррогатных пар вроде 👨‍💻 видятся как две кодовые единицы UTF-16 и шаблоны вроде ^.$ не смогут с ними совпасть; с /u точка трактует каждую кодовую точку графемы как один символ. Для RTL-письменностей (арабский, иврит) шаблоны работают без специальной обработки — направление это забота уровня отрисовки, а не движка regex. CJK-контент совпадает так же, как латиница.
В чём разница между .match, .matchAll, .replace и .split с regex?
String.prototype.match возвращает первое совпадение (или массив всех при включённом /g), но теряет группы захвата при /g. String.prototype.matchAll требует /g и возвращает итератор массивов совпадений С группами захвата и индексами — это то, что использует этот тестер внутри. String.prototype.replace принимает либо строковый шаблон ($1, $& и т.д.), либо callback, вызываемый для каждого совпадения с (match, ...groups, offset, string, namedGroups). String.prototype.split разбивает по каждому совпадению — полезен с /g, но глобальный флаг игнорируется для семантики split. Этот инструмент выставляет match через вкладку Match, replace через Replace и split через Split, чтобы вы могли предпросмотреть каждый вариант, не покидая страницу; литерал /pattern/flags — в одном клике, когда вы готовы вставить в код.
Почему мой regex из Python или Java не работает здесь?
Потому что этот тестер запускает ECMA-262 (JavaScript) — большинство шаблонов переносится чисто, горстка нет. Типичные подводные камни порта: (1) Встроенные флаги Python (?i) и (?x) не валидны в JS — используйте чипсы флагов сверху. (2) \A и \Z из Python — это ^ и $ в JS (с /m для строчных якорей). (3) Условные конструкции Java/Python (?(name)yes|no) не поддерживаются в JS — перепишите альтернацией. (4) Поссессивные квантификаторы a++ и атомные группы (?>...) недоступны в JS — имитируйте через (?=(a+))\1. (5) (?P<name>...) из Python — это (?<name>...) в JS. (6) \h для горизонтального пробела и \v для вертикального не в JS — используйте [ \t] и [\n\r]. Для портируемого переноса пояснитель разбирает, что делает каждый токен, чтобы вы могли заменить неподдерживаемый синтаксис эквивалентом.
Есть ли максимальный размер текста или число совпадений?
Практический предел: около 200 000 символов тестового текста и 500 подсвеченных совпадений, отображаемых одновременно. Свыше 500 совпадений панель Совпадений показывает баннер «Показаны первые 500»; бейдж счётчика всё равно сообщает истинный итог. Бюджет «настенных часов» в 250мс ограничивает разогнавшиеся шаблоны независимо от размера. Для многомегабайтных логов запускайте regex командной строкой grep -oE или rg (ripgrep) — они потоковые и не упрутся в потолок отрисовки UI. Для разовых сканов огромного текста вставьте репрезентативный кусок в этот тестер, чтобы провалидировать шаблон, потом запустите провалидированный шаблон по всему файлу в шелле.

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

Все инструменты →

Конвертер регистра — UPPER, lower, camelCase и snake_case

Работа с текстом

Конвертируйте текст между UPPERCASE, lowercase, Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE и ещё 6 форматами мгновенно. Бесплатно, только в браузере, без регистрации.

Генератор Lorem Ipsum — текст-рыба онлайн

Работа с текстом

Создавайте текст-заполнитель Lorem Ipsum мгновенно — по абзацам, предложениям, словам, байтам или спискам. Копируйте или скачивайте как обычный текст, HTML, Markdown или JSON. 100% бесплатно, приватно, в браузере. Без регистрации.

Удаление повторяющихся строк из текста

Работа с текстом

Удаляйте повторяющиеся строки из текста онлайн — бесплатно, мгновенно, 100% в браузере. Игнорируйте регистр или пробелы, оставляйте первое или последнее вхождение, считайте удалённые дубликаты. Также сортировка и очистка.

Генератор URL-слагов — slugify любого текста

Работа с текстом

Превращайте любой заголовок в чистый SEO-дружественный URL-слаг мгновенно. Транслитерация акцентов и кириллицы или сохранение Unicode-букв. 100% приватно, прямо в браузере.

Сортировка строк текста по алфавиту и естественно

Работа с текстом

Сортируйте строки текста по алфавиту, по числам (естественный порядок) или по длине, по возрастанию или убыванию. Бесплатный онлайн-сортировщик строк, 100% в браузере. Также удаление повторов и очистка списков. Без регистрации.

Сравнение текста и Diff

Работа с текстом

Сравните два текста мгновенно в браузере. Просмотр бок о бок, подсветка слов, экспорт unified diff, опции игнорирования регистра/пробелов/пустых строк. 100 % в браузере — без загрузки.