Як користуватися: Тестер регулярних виразів
- Введіть шаблон між слешами, без обрамлювальних
/. - Вмикайте прапорці, наприклад
g (усі збіги), i (без урахування регістру) і m (багаторядковий режим). - Вставте тестовий текст. Збіги підсвічуються праворуч і перелічуються нижче з індексом і групами захоплення.
- Позначте Заміна й введіть рядок заміни на кшталт
$1 або $<name>, щоб побачити результат String.replace. - Виберіть шаблон у Бібліотеці шаблонів, щоб почати з перевіреного regex для email, URL, IP чи дати.
Регулярні вирази JavaScript
Тестер використовує вбудований рушій RegExp вашого браузера, тому результати точно збігаються з тим, що повертають String.match, matchAll, replace і RegExp.exec у JavaScript і Node.js. Включно із сучасним синтаксисом: іменованими групами (?<name>…), перевіркою назад (?<=…), Unicode property escapes на кшталт \p{L} із прапорцем u та індексами збігів із прапорцем d.
Що роблять прапорці
| Прапорець | Назва | Ефект |
g | global | Знайти всі збіги, а не зупинитися на першому. |
i | ignoreCase | Літери збігаються незалежно від регістру. |
m | multiline | ^ і $ збігаються на початку й у кінці кожного рядка. |
s | dotAll | . збігається й з переведенням рядка. |
u | unicode | Шаблон обробляється за кодовими точками; вмикає \p{…} і \u{…}. |
y | sticky | Збіг лише з поточної позиції lastIndex. |
d | hasIndices | Повертає початкову й кінцеву позиції для кожної групи захоплення. |
Захист від катастрофічного бектрекінгу
Шаблони з вкладеними квантифікаторами, наприклад (a+)+$ або (\w|\d)*x, можуть працювати експоненційно довго на майже відповідних рядках. На звичайній вебсторінці це підвішує вкладку. Тут кожен пошук виконується у фоновому Web Worker, який зупиняється через одну секунду, і замість зависання браузера ви отримуєте зрозуміле попередження. Той самий шаблон у продакшн-коді може бути вразливістю ReDoS, тож сприймайте попередження як баг, який треба виправити.
Поради щодо написання regex
- Прив'язуйте шаблони через
^ і $ під час перевірки цілих значень, інакше пройде збіг у будь-якому місці рядка.
- Віддавайте перевагу конкретним класам на кшталт
[^"]* замість .*: вони швидші й не захоплюють зайвого.
- Використовуйте незахоплювальні групи
(?:…), коли захоплене значення не потрібне.
- Давайте групам імена.
match.groups.year читається простіше, ніж match[1].
Поширені запитання
Який діалект regex використовується?
JavaScript (ECMAScript) через вбудований у браузер RegExp. Більшість синтаксису спільна з PCRE, Python і Java, але присвійні квантифікатори, атомарні групи та вбудовані модифікатори на кшталт (?i) у JavaScript недоступні.
Чому мій шаблон знаходить лише один збіг?
Без прапорця g (global) JavaScript зупиняється після першого збігу. Увімкніть g, щоб знайти всі входження.
Як посилатися на групи в рядку заміни?
Використовуйте $1, $2… для нумерованих груп, $<name> для іменованих, $& для всього збігу й $$ для символу долара.
Чому тестер зупинився за таймаутом?
Шаблон обробляв ваше введення довше за секунду, що майже завжди означає катастрофічний бектрекінг. Шукайте вкладені квантифікатори на кшталт (x+)+ або альтернативи, що перетинаються, як (a|a)*, і перепишіть їх так, щоб кожен символ міг збігтися лише одним способом.
Чи надсилаються мої тестові дані кудись?
Ні. Пошук виконується локально в Web Worker у вашому браузері. Шаблон і текст зберігаються лише у вашому браузері, щоб вони залишилися на місці, коли ви повернетеся.