Тестер регулярных выражений
Выражение выполняется в вашем браузере, в отдельном потоке и с ограничением времени. Поэтому даже регулярка, которая зацикливается, не подвесит страницу — вы просто увидите предупреждение.
Об инструменте: проверка регулярных выражений
Регулярное выражение редко выходит правильным с первого раза, а проверять его прямо в коде долго. Этот инструмент показывает совпадения сразу во время набора: подсвечивает найденное в тексте, разбирает каждое совпадение на группы и умеет показать результат замены. Здесь нет сторонней рекламы и регистрации.
Всё выполняется в вашем браузере — ни выражение, ни текст не отправляются на сервер.
Главные преимущества инструмента:
Зациклившееся выражение не подвесит страницу: поиск идёт в отдельном потоке с ограничением времени. Это редкость среди онлайн-тестеров, а проблема вполне реальная — ниже объясняем, почему.
Группы видны отдельно: под каждым совпадением перечислены нумерованные и именованные группы, поэтому сразу понятно, что именно попадёт в
$1или$<название>.Режим замены: переключатель показывает не совпадения, а готовый результат — так проще составлять выражение для массовой правки текста.
Флаги
g— искать все совпадения, а не только первое. Без него инструмент покажет одну находку.i— не учитывать регистр букв.m— многострочный режим:^и$начинают означать начало и конец каждой строки, а не всего текста.s— точка начинает совпадать и с символом переноса строки.u— корректная работа с юникодом. Нужен, если в выражении есть\p{...}или символы вне базовой латиницы.y— липкий поиск: совпадение должно начинаться ровно с текущей позиции.
Почему плохое выражение может повесить браузер
Это называют катастрофическим бэктрекингом. Когда в выражении вложенные повторения, как в (a+)+$, движок перебирает все возможные способы разбить строку. Количество вариантов растёт вдвое с каждым символом, поэтому уже на трёх десятках букв вычисление длится дольше, чем вы готовы ждать.
В обычном тестере такое выражение намертво вешает вкладку, и спасёт лишь её закрытие: остановить уже выполняющуюся регулярку невозможно. Поэтому здесь поиск вынесен в отдельный поток, и если он не укладывается в полторы секунды, поток просто останавливается, а вы видите предупреждение вместо зависания.
Практический вывод шире этого инструмента: если регулярное выражение обрабатывает данные, которые приходят извне, вложенных повторений стоит избегать. Иначе это не просто неудобство, а способ положить сервер одной строкой.
Несколько практических советов
Начинайте с малого: составьте выражение для одного случая, а затем расширяйте, каждый раз сверяясь со списком совпадений.
Вместо точки берите конкретнее:
[^,]+работает быстрее и предсказуемее, чем.+, и реже даёт катастрофический бэктрекинг.Именованные группы читабельнее:
(?<year>\d{4})в коде понятнее, чем$1, особенно когда групп несколько.Не разбирайте HTML регулярками: вложенные теги невозможно описать регулярным выражением в принципе. Для этого есть парсеры.