🔎
Код

Тестер регулярних виразів

Тестер регулярних виразів
/ /
$1, $2 — номери груп, $<назва> — іменована група, $& — увесь збіг
Результат

        

Вираз виконується у вашому браузері, в окремому потоці й з обмеженням часу. Тому навіть регулярка, яка зациклюється, не підвісить сторінку — ви просто побачите попередження.

Про інструмент: перевірка регулярних виразів

Регулярний вираз рідко виходить правильним з першого разу, а перевіряти його прямо в коді довго. Цей інструмент показує збіги одразу під час набору: підсвічує знайдене в тексті, розбирає кожен збіг на групи й уміє показати результат заміни. Тут немає сторонньої реклами й реєстрації.

Усе виконується у вашому браузері — ані вираз, ані текст не надсилаються на сервер.

Головні переваги інструменту:

  • Зациклений вираз не підвісить сторінку: пошук іде в окремому потоці з обмеженням часу. Це рідкість серед онлайн-тестерів, а проблема цілком реальна — нижче пояснюємо, чому.

  • Групи видно окремо: під кожним збігом перелічені нумеровані та іменовані групи, тому одразу зрозуміло, що саме потрапить у $1 чи $<назва>.

  • Режим заміни: перемикач показує не збіги, а готовий результат — так простіше складати вираз для масової правки тексту.

Прапорці

  • g — шукати всі збіги, а не лише перший. Без нього інструмент покаже одну знахідку.

  • i — не зважати на регістр літер.

  • m — багаторядковий режим: ^ і $ починають означати початок і кінець кожного рядка, а не всього тексту.

  • s — крапка починає збігатися й із символом переносу рядка.

  • u — коректна робота з юнікодом. Потрібен, якщо у виразі є \p{...} або символи поза базовою латиницею.

  • y — липкий пошук: збіг має починатися рівно з поточної позиції.

Чому поганий вираз може повісити браузер

Це називають катастрофічним бектрекінгом. Коли у виразі вкладені повторення, як у (a+)+$, рушій перебирає всі можливі способи розбити рядок. Кількість варіантів росте вдвічі з кожним символом, тому вже на трьох десятках літер обчислення триває довше, ніж ви готові чекати.

У звичайному тестері такий вираз намертво вішає вкладку, і врятує лише її закриття: зупинити регулярку, що вже виконується, неможливо. Тому тут пошук винесений в окремий потік, і якщо він не вкладається у півтори секунди, потік просто зупиняється, а ви бачите попередження замість зависання.

Практичний висновок ширший за цей інструмент: якщо регулярний вираз обробляє дані, які приходять ззовні, вкладених повторень варто уникати. Інакше це не просто незручність, а спосіб покласти сервер одним рядком.

Кілька практичних порад

  • Починайте з малого: складіть вираз для одного випадку, а потім розширюйте, щоразу звіряючись зі списком збігів.

  • Замість крапки беріть конкретніше: [^,]+ працює швидше й передбачуваніше, ніж .+, і рідше дає катастрофічний бектрекінг.

  • Іменовані групи читабельніші: (?<year>\d{4}) у коді зрозуміліший за $1, особливо коли груп кілька.

  • Не розбирайте HTML регулярками: вкладені теги неможливо описати регулярним виразом у принципі. Для цього є парсери.