ToolActToolAct

Инструмент тестирования регулярных выражений

Тестирование и отладка регулярных выражений в реальном времени с подсветкой результатов и генерацией кода

Регулярное выражение
//g
Флаги
gglobal
iignore case
mmultiline
sdotAll
uunicode
Частые примеры
Тестовый текст
Результаты совпадений0 совпадений
Нет совпадений

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

Инструмент Regex помогает писать, тестировать и понимать регулярные выражения. Регулярное выражение описывает текстовые шаблоны для поиска, извлечения, проверки и замены: похожие на email строки, поля логов, URL, ID, даты или повторяющееся форматирование. Тестер показывает совпадения, capture groups, flags и пограничные случаи до использования шаблона в коде, data pipeline или форме. Regex мощен, но его легко переоценить: шаблон может находить слишком много или слишком мало, тормозить на больших входах или плохо учитывать Unicode и локальные правила. Для сложных парсеров, HTML и критичной валидации часто безопаснее специализированная библиотека. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.

Как использовать

Как использовать

  1. Введите regex-шаблон в левое поле ввода
  2. Выберите нужные флаги (например, g для глобального поиска, i для поиска без учёта регистра)
  3. Введите тестовый текст в правом поле
  4. Просмотрите подсвеченные совпадения и сведения о них

Советы по regex

  • Тестируйте шаблоны на примерах как с совпадениями, так и без них — так будет проще обнаружить слишком широкие выражения.
  • Будьте осторожны с вложенными квантификаторами на длинном тексте: некоторые шаблоны могут работать медленно из-за чрезмерного отката.

Применение

Тестирование JavaScript-регулярных выражений в реальном времениВведите шаблон, выберите флаги g, i, m, s и u и тестируйте на примере текста с подсветкой совпадений. Неверный синтаксис regex ловится сразу, а глобальные совпадения нулевой длины обрабатываются без зацикливания. Обратная связь в реальном времени ускоряет итеративную подгонку по сравнению с запуском скрипта в консоли или перезапуском редактора при каждом изменении шаблона.
Проверка позиций совпадений и именованных группКаждое совпадение показывает текст, смещения начала и конца, а также именованные capture groups при наличии. Это удобно при доработке шаблонов извлечения для логов, валидации форм, правил импорта или скриптов очистки данных. Видимые смещения позволяют вставить тот же шаблон в более широкий конвейер, который уже отслеживает позиции символов в исходном файле.
Превращение рабочего шаблона в фрагменты кодаПримените встроенные примеры для email, URL, IP, дат, цветов, китайского текста, чисел и пробелов, затем сгенерируйте копируемые фрагменты для JavaScript, Python, Java, PHP или Go с учётом выбранных флагов там, где язык их поддерживает. Сгенерированные фрагменты содержат буквальный шаблон и набор флагов, поэтому поведение в рантайме совпадает с тем, что было протестировано на странице.
Отладка катастрофического бэктрекингаВставьте длинную или провокационную строку в тестер, чтобы выявить вложенные квантификаторы вроде (a+)+ или .*foo.*, которые замораживают движок. Наблюдайте за счётчиком совпадений и смещениями: если итерация зависает или растёт потребление памяти, упростите шаблон с помощью atomic groups, possessive quantifiers или ужесточения привязок. Хороший шаблон выдерживает худший вход без экспоненциального взрыва.
Сравнение жадных и ленивых квантификаторов, lookbehind и \p{L}Используйте тестер, чтобы увидеть, как жадные квантификаторы (.*) и ленивые (.*?) выбирают разные префиксы в одном тексте, затем проверьте поддержку lookbehind (?<=), доступного в JavaScript и PCRE, но не во всех старых движках. Включите флаг u для использования Unicode property classes вроде \p{L} (любая буква) и \p{Sc} (символ валюты), чтобы шаблоны на основе букв работали корректно для латиницы, кириллицы и иероглифов.

Технический принцип

Тестер работает на движке ECMAScript RegExp, определённом в спецификации языка. Регулярные выражения ECMAScript — это реализация NFA с возвратом (backtracking): движок пробует каждую альтернативу слева направо и откатывается при неудаче квантификатора, что делает возможными lookaround и обратные ссылки, но также порождает катастрофический возврат на враждебных входных данных. Шесть распознаваемых флагов: g (глобальный), i (без учёта регистра), m (многострочный, привязки по строкам), s (dotAll, '.' совпадает с переводом строки), u (режим Unicode) и y (sticky, привязка к lastIndex). Семантика совпадений резко меняется в зависимости от флагов. С флагом /u движок рассматривает шаблон как последовательность Unicode code points, а не UTF-16 code units, поэтому суррогатные пары совпадают как один символ, а Unicode property classes вроде \p{L} (любая буква), \p{Sc} (символ валюты) и \p{Script=Han} становятся доступны. Именованные группы захвата (?<name>...) и lookbehind (?<=...) входят в ES2018 и поддерживаются в Chromium 64+, Firefox 78+ и Safari 16.4+, но такие возможности PCRE как атомарные группы (?>...) и possessive quantifiers (a++) по-прежнему не входят в спецификацию. Наибольшая production-опасность — это ReDoS: шаблон вроде (a+)+b на входе 'aaaaaaaaaaaaaaaa!' порождает экспоненциальное число путей, поскольку два вложенных квантификатора могут разбить одну последовательность символов множеством способов. Меры профилактики хорошо известны: избегать вложенных квантификаторов над одним и тем же классом символов, использовать привязки ^ и $ где возможно, предпочитать атомарные группы при поддержке движком, или переключиться на линейный движок, например RE2 от Go (который жертвует обратными ссылками и lookbehind ради гарантированного O(n) совпадения). Для ненадёжного входа, предназначенного для серверной валидации, RE2 или написанный вручную парсер почти всегда более безопасный выбор.

  • Движок: ECMAScript RegExp — это NFA с возвратом, а не DFA; именно это делает возможными lookaround и обратные ссылки, но также делает возможным катастрофический возврат.
  • Флаги: g (глобальный), i (без учёта регистра), m (^/$ по строкам), s (dotAll, '.' совпадает с \n), u (режим Unicode, учитывающий суррогаты), y (sticky, привязка к lastIndex).
  • Режим Unicode: /u открывает совпадение по code points и доступ к \p{L} (буква), \p{Sc} (валюта), \p{Script=Han}; без /u шаблон [a-zA-Z]+ пропускает любое не-латинское слово.
  • Доступность современного синтаксиса: именованные группы захвата (?<n>...) и lookbehind (?<=...) поддерживаются в Chromium 64+, Firefox 78+, Safari 16.4+; атомарные группы (?>...) и possessive quantifiers (a++) не входят в ECMAScript.
  • ReDoS: вложенные квантификаторы над одним классом, такие как (a+)+b, экспоненциально разрастаются; ужесточите привязками, атомарными группами или перейдите на RE2 / re2-wasm для ненадёжного входа.
  • Нижняя граница сложности: литеральные привязанные шаблоны над фиксированным алфавитом работают за O(n); обратные ссылки и неограниченные lookaround в худшем случае приводят к экспоненциальной сложности, поэтому тестируйте на враждевном входе перед релизом.

Примеры

Сопоставление email-адреса

Шаблон: ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Флаги:   gi

Вход:    contact: alice@example.com, bob_2024@mail.co.uk, invalid@.com
Совпадения: alice@example.com, bob_2024@mail.co.uk  (2 совпадения)

Извлечение IPv4-адресов из лога

Шаблон: \b(?:\d{1,3}\.){3}\d{1,3}\b
Флаги:   g

Вход:    2026-06-15 ERROR client 192.168.1.42 connect failed (peer 10.0.0.1)
Совпадения: 192.168.1.42, 10.0.0.1

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

Шаблон: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Флаги:   g

Вход:    Sprint window: 2026-09-01 to 2026-09-15
Группы:  {year:'2026', month:'09', day:'01'}, {year:'2026', month:'09', day:'15'}

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

Вход:    <b>hello</b> <i>world</i>

.*  (жадный) -> сопоставляет всю строку: <b>hello</b> <i>world</i>
.*? (ленивый) -> только первое совпадение: <b>hello</b>

Ленивый — это то, что обычно нужно при извлечении данных между тегами.

Класс букв с поддержкой Unicode

Шаблон: \p{L}+
Флаги:   gu

Вход:    Hello, 北京! Café Москва
Совпадения: Hello, 北京, Café, Россия

Без флага u и \p{L}, [a-zA-Z]+ пропустил бы каждое нелатинское слово.

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

Какой диалект регулярных выражений использует тестер?

Движок регулярных выражений JavaScript (ECMAScript). Для большинства возможностей он похож на PCRE, но различается в краях: нет посессивных квантификаторов, нет рекурсии, lookbehind работает только в современных браузерах, именованные группы записываются как (?<name>...). Для Python (re/regex), Java, .NET или PCRE поведение того же шаблона может отличаться — обязательно проверяйте в целевой среде.

Какие флаги поддерживаются?

g (глобальный, ищет все совпадения), i (без учёта регистра), m (многострочный, ^ и $ совпадают с границами строк), s (dotall, точка совпадает с переводом строки), u (Unicode), y (sticky), d (hasIndices). Включайте их в строке переключателей; страница показывает, как каждый флаг меняет поведение на вашем тестовом тексте.

Почему мой шаблон находит меньше совпадений, чем ожидалось?

Без флага g функция regex.exec возвращает только одно совпадение. Без m символы ^ и $ совпадают только с самым началом и концом всего ввода. Без u символы из суррогатных пар (эмодзи) рассматриваются как две половины. Большинство проблем «почему это не работает» — это пропущенные флаги.

Как искать эмодзи и иероглифы CJK?

Включите флаг u, чтобы корректно работать с Unicode. Используйте классы символов \p{...} (\p{Letter}, \p{Script=Han}, \p{Emoji}), чтобы искать по свойствам Unicode. Без u класс [a-zA-Z] не совпадает с буквами с диакритикой — либо расширьте до [a-zA-ZÀ-ÿ], либо используйте \p{L}.

Можно ли сгенерировать код по шаблону?

Большинство сборок экспортируют шаблон в синтаксисе JavaScript, Python, PHP, Ruby, Go или Java с нужным экранированием. Но имейте в виду: один и тот же шаблон может вести себя по-разному в разных движках (значения жадности по умолчанию, классы символов, поддержка lookaround). Всегда проверяйте в целевом языке.

Чем отличаются жадные и ленивые квантификаторы?

Жадные (* + ?) захватывают как можно больше, а потом откатываются при необходимости. Ленивые (*? +? ??) захватывают как можно меньше. Для задачи «извлечь всё между A и B» жадный .* «перепрыгнет» через несколько B; ленивый .*? остановится на первом же B. По умолчанию для извлечения внутреннего содержимого выбирайте ленивый вариант.

Загружается ли мой регекс или текст для теста?

Нет. Сопоставление выполняется в вашем браузере встроенным движком регулярных выражений JavaScript. Шаблоны и входные данные никуда не передаются.

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

Инструмент сравнения текста

Бесплатный онлайн-инструмент для сравнения текста с подсветкой различий. Построчное сравнение помогает быстро найти изменённые фрагменты.

Конвертер регистра

Бесплатный онлайн-конвертер регистра: camelCase, snake_case, kebab-case, CONSTANT и другие форматы. Незаменим для разработчиков при переименовании переменных.

Инструмент подсчета слов

Бесплатный онлайн-счётчик символов, слов, абзацев и времени чтения в реальном времени. Незаменимый помощник при написании статей, эссе и постов для соцсетей.

Инструмент дедупликации текста

Бесплатный онлайн-инструмент для удаления дубликатов текста с режимами по строкам, словам, предложениям и абзацам. Удаляйте дубликаты с опциями регистра и порядка.

Инструмент реверса строки

Бесплатный онлайн-инструмент для разворота строки: целиком, по словам или по строкам. Удобная обработка текста для самых разных задач прямо в браузере.

Инструмент преобразования китайского

Бесплатный онлайн-конвертер китайского письма между упрощённым и традиционным. Учитывает различия в лексике материкового Китая, Тайваня и Гонконга при переводе.