Инструкция
Как проверить regex, ничего не устанавливая
Вы написали шаблон и хотите понять, действительно ли он совпадает с тем, что вы ожидаете, прежде чем вставлять его в код. Ставить настольную программу или вставлять приватный лог на случайный сайт - это перебор и зачастую рискованно. В этом руководстве показано, как прогнать regex по собственному тексту прямо в браузере, переключать флаги, меняющие поведение, читать извлечённые группы захвата и видеть подсветку совпадений прямо на месте, при этом шаблон и текст никогда не покидают вашу вкладку.
Шаг за шагом
- Откройте тестер regex и введите свой шаблон в поле между двумя косыми чертами. Сами черты вы не пишете: инструмент показывает их, чтобы вы видели шаблон так, как его читает движок. Вставьте образец текста в поле ниже, например несколько строк лога, список адресов почты или фрагмент кода, по которому хотите искать.

- Задайте флаги в небольшом поле рядом с шаблоном. Флаг g находит все совпадения, а не останавливается на первом; i делает поиск нечувствительным к регистру; m позволяет якорям ^ и $ совпадать с началом и концом каждой строки, а не всего текста; s позволяет точке совпадать и с переносами строк. Сочетайте их свободно, например gim.
- Нажмите Test. Каждое совпадение подсвечивается прямо в вашем тексте, а список ниже показывает все совпадения с их позицией и значением каждой группы захвата. Подправьте шаблон и запустите снова: предпросмотр обновится, и вы сможете сужать шаблон, пока он не поймает ровно то, что вы имели в виду, и ничего лишнего.

Группы захвата, именованные и нумерованные
Группа захвата - это часть шаблона, заключённая в круглые скобки, и именно так вы извлекаете кусок из каждого совпадения, а не просто подтверждаете, что всё совпало целиком. Нумерованные группы считаются слева направо по открывающей скобке: в (\d{4})-(\d{2})-(\d{2}) группа 1 - это год, группа 2 - месяц, группа 3 - день. Именованные группы используют синтаксис (?<name>...), поэтому (?<year>\d{4}) читается гораздо лучше, чем голый номер, когда шаблон разрастается. Если вам нужно лишь сгруппировать без захвата, например чтобы применить квантификатор к нескольким символам, используйте группу без захвата (?:...), чтобы она не засоряла список результатов. Тестер показывает значение каждой группы для каждого совпадения - это самый быстрый способ убедиться, что вы извлекаете нужный фрагмент.
Когда шаблон зависает или ведёт себя не так
Две проблемы возникают снова и снова. Первая - катастрофический возврат: шаблон вроде (a+)+$, запущенный на длинной несовпадающей строке, может заставить движок перебрать экспоненциальное число путей и зависнуть. Тестер выполняет каждую проверку в Web Worker с коротким сторожевым таймером, поэтому вместо зависшей вкладки вы получаете понятное сообщение и можете упростить шаблон - обычно сделав квантификатор по сути захватническим, поставив якорь или избегая вложенных повторений. Вторая - жадное против ленивого совпадения: по умолчанию .* захватывает столько, сколько может, поэтому, чтобы совпасть с содержимым одного тега HTML, вам нужна ленивая форма .*?. Если вы сравниваете две слегка различающиеся версии строки, чтобы понять, на что должен нацеливаться ваш шаблон, инструмент сравнения текста выравнивает их, чтобы разница стала очевидной до того, как вы напишете выражение.
Как браузер оценивает ваше регулярное выражение
Современные браузеры поставляются со встроенным движком регулярных выражений ECMAScript, который поддерживает полный набор флагов: регистронезависимое совпадение (i), многострочный режим (m), dotAll (s), Unicode (u) и флаг привязки (y). Когда вы вводите шаблон в тестере, движок компилирует его во внутренний NFA и в реальном времени оценивает его относительно вашей тестовой строки, сообщая о каждой позиции совпадения и любых группах захвата. Возврат с откатом происходит локально на вашем CPU: шаблон вроде (a+)+ на длинной несовпадающей строке может крутиться секундами, и наблюдение этого зависания в браузере является полезной обратной связью перед развёртыванием шаблона в рабочем коде. Никакой текст не покидает страницу, поэтому вы можете вставлять образцы журналов или любые входные данные без их маршрутизации через сторонний сервер.
Инструменты из этого гайда
Частые вопросы
Отправляются ли мой шаблон или проверочный текст на сервер?
Нет. Regex выполняется внутри Web Worker в вашем собственном браузере, поэтому шаблон и текст, на котором вы проверяете, остаются во вкладке. Это важно, потому что вставляемый текст часто бывает реальным логом, списком клиентов или внутренним конфигом - именно теми данными, которые вы не хотите отдавать на чужой сервер. Откройте панель Network в инструментах разработчика, когда нажмёте Test, и вы не увидите ни одного запроса, который уносил бы ваш текст наружу. К тому же инструмент продолжает работать офлайн после того, как страница загрузилась.
Какой диалект regex использует тестер?
Он использует движок регулярных выражений JavaScript, встроенный в ваш браузер, тот же, что работает в Node.js и на любой веб-странице. Это покрывает распространённый синтаксис: классы символов, квантификаторы, якоря, чередование, нумерованные и именованные группы захвата, опережающую и ретроспективную проверку. Несколько возможностей из других диалектов, таких как рекурсия в стиле Perl или захватнические квантификаторы, не входят в движок JavaScript, поэтому если шаблон, скопированный вами из проекта на PHP или Python, ведёт себя иначе, причина обычно именно в этой разнице диалектов.