Бесплатный тестер regex — отладка совпадений онлайн
Тестируйте регулярные выражения мгновенно на любом тексте. Подсветка совпадений, группы захвата, предпросмотр замены, разбиение и пояснение. Regex в стиле JavaScript, бесплатно, конфиденциально, без регистрации.
Что такое тестер regex?
Тестер regex (тестер регулярных выражений) — это инструмент, который позволяет написать regex-шаблон, вставить кусок тестового текста и точно увидеть, с чем шаблон совпадает — с группами захвата, предпросмотром замены и разбором флагов — без перекомпиляции кода или запуска скрипта. Для разработчиков он сокращает цикл с минут до миллисекунд: подправил шаблон, посмотрел, как сдвинулась подсветка, отгрузил regex с уверенностью.
Регулярное выражение — это компактный язык для описания текстовых шаблонов. `\d+` совпадает с одной или более цифрой. `[A-Za-z_]\w*` совпадает с типичным идентификатором. `(?
Этот тестер запускает нативный движок RegExp ECMA-262, поставляющийся с каждым современным браузером — тот же движок, что вы зовёте из JavaScript, TypeScript, Node.js, Deno или Bun. Это значит: группы захвата (нумерованные и именованные через `(? Что тестер показывает помимо сырых совпадений: панель «Совпадения и группы захвата» перечисляет каждое совпадение со смещениями [start, end) и значением каждой группы захвата — ту же информацию, что вы получили бы от `String.prototype.matchAll` с флагом /d, но разложенную под визуальный просмотр. Вкладка Replace показывает живой предпросмотр подстановки, поддерживающий весь алфавит шаблонов $1 / $& / $` / $' / $$ / $ По части конфиденциальности: каждая операция локальна. Ваш шаблон и тестовый текст никогда не покидают страницу — они не логируются, не отправляются в аналитический сервис, не сохраняются на диск. В 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), полным текстом совпадения и каждой позиционной и именованной группой захвата внутри. Именованные группы помечают себя как $
Живой предпросмотр Replace с $1 / $& / $
Переключитесь на вкладку Replace, чтобы увидеть вашу подстановку, применённую в реальном времени. Работает полный алфавит замен ECMAScript: $1..$N для позиционных, $
Разбиение по границам 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 появляются в правой панели как $
Поиск и замена с обратными ссылками $1
(\w+) (\w+)
Замена: $2, $1 → Jack Doe → Doe, Jack
Две неименованные группы захвата, шаблон замены $2, $1, и вкладка Replace даёт живой предпросмотр. $&, $`, $', $$ и $
Срезать концевые пробелы построчно
[ \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
Введите шаблон между слэшами
Бросьте любое регулярное выражение ECMA-262 в поле /…/. Плохие шаблоны подсвечиваются красным с сообщением парсера; валидные шаблоны идут на живой матчинг.
- 2
Переключите нужные флаги
g (global), i (case-insensitive), m (multiline), s (dotAll), u (unicode), y (sticky), d (indices). Каждый чипс загорается, когда включён; индикатор справа от шаблона показывает канонический литерал.
- 3
Вставьте тестовый текст
Совпадения подсвечиваются чередующимися цветами по мере ввода. Панель «Совпадения и группы захвата» справа перечисляет каждое совпадение со смещениями [start, end) и значением каждой группы захвата (именованные группы помечены как $
). - 4
Переключайтесь между вкладками Replace, Split и Explain
Replace предпросматривает шаблон подстановки рядом с вводом. Split режет по каждой границе совпадения. Explain разбирает шаблон токен за токеном с описанием простым языком для каждого элемента.
- 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']
Жадный квантификатор съел слишком много
`.+` потребляет как можно больше, поэтому `<.+>` на ` and ` захватывает ` and `, а не ``. Используйте ленивые квантификаторы (`.+?`), более ограничивающие классы символов (`[^>]+`) или заякорьте через 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, $&, $`, $', $$ и $
вручную, а не делегирует `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 для новых шаблонов, если у вас нет конкретной причины не делать этого.
- Именуйте свои группы захвата
- `(?
\d{4})-(? \d{2})` самодокументирующийся. Через шесть месяцев, когда вы читаете regex обратно, `m.groups.year` очевидно год — `m[1]` нет. Шаблоны замен с $ переживают переупорядочивание групп: позиционные шаблоны ломаются в момент, когда кто-то добавляет ещё одну группу. - Тестируйте случаи провала, не только успеха
- Тестер regex — для провалов. Подтвердите, с чем шаблон совпадает, потом намеренно мутируйте тестовый текст, чтобы увидеть, с чем не совпадает — ведущий пробел, концевой пробел, пропущенные части, лишние части, неверный регистр, смешанные письменности. Шаблоны, проходящие валидный ввод, но принимающие мусор — это баги, которые продакшен показывает первыми.
Часто задаваемые вопросы
Передаётся ли мой regex или тестовый текст на ваш сервер?
Какой диалект regex использует этот тестер — PCRE, Python, Java, JavaScript?
Что делает каждый из флагов g, i, m, s, u, y, d?
Как написать группы захвата и как на них ссылаться обратно?
Как работают look-ahead и look-behind и для чего они нужны?
Почему мой regex вешает браузер и что такое катастрофический бэктрекинг?
Чем этот тестер regex отличается от regex101.com?
Как экранировать спецсимволы вроде . | ( ) [ ] { } * + ? ^ $ \?
Можно ли поделиться regex с коллегой по ссылке?
Поддерживает ли тестер Unicode, эмодзи и нелатинские письменности?
В чём разница между .match, .matchAll, .replace и .split с regex?
Почему мой regex из Python или Java не работает здесь?
Есть ли максимальный размер текста или число совпадений?
Похожие инструменты
Все инструменты →Сравнение текста и Diff
Работа с текстом
Сравните два текста мгновенно в браузере. Просмотр бок о бок, подсветка слов, экспорт unified diff, опции игнорирования регистра/пробелов/пустых строк. 100 % в браузере — без загрузки.
Бесплатный счётчик слов и символов
Работа с текстом
Подсчитывайте слова, символы, предложения, абзацы и время чтения мгновенно. Счётчик слов в реальном времени с проверкой лимитов Twitter, meta description и Instagram. Бесплатно, приватно, без регистрации.
Конвертер систем счисления — bin, hex, dec, oct
Конвертеры
Конвертация между системами счисления — двоичной, hex, десятичной, восьмеричной и любой базой 2-36 мгновенно. Бесплатно, приватно — вся обработка в браузере.
Base64 декодер и кодировщик
Кодирование и форматирование
Декодирование и кодирование Base64 онлайн бесплатно. Преобразование в реальном времени с полной поддержкой UTF-8 и эмодзи. Полная приватность — работает в браузере. Без регистрации.
Генератор crontab и конструктор cron-выражений
Дата и время
Создавайте, проверяйте и расшифровывайте cron-выражения в браузере. Предпросмотр запусков в локальном времени или UTC. POSIX 5 полей, пресеты, описание простым языком. Бесплатно и приватно.
Конвертер CSV в JSON
Кодирование и форматирование
Конвертируйте CSV в JSON в браузере. RFC 4180, определение типов, заголовок, безопасность больших целых. 100% приватно, без загрузки.