Тестер регулярних виразів
Введіть шаблон, позначте потрібні прапорці та вставте текст: кожен збіг підсвічується просто під час введення і з’являється у списку з позицією та групами захоплення. Шаблон виконується власним рушієм регулярних виразів JavaScript у вашому браузері, тому результати збігаються з поведінкою вашого коду, а текст не залишає ваш пристрій.
0 символів · 0 слів · 0 рядків
Збіги буде виділено тут.0 символів · 0 слів · 0 рядків
Працює повністю у вкладці браузера. Ваш текст ніколи не завантажується на сервер і не зберігається.
Токени регулярних виразів JavaScript
Стовпець першого збігу отримано запуском кожного шаблону на його тексті рушієм JavaScript, що будував цю сторінку.
| Токен | Значення | Шаблон | Текст | Перший збіг |
|---|---|---|---|---|
\d | Цифра 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | Літера, цифра або підкреслення (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Пробільний символ, зокрема табуляція та переноси рядків | /\s+/ | two spaces | |
. | Будь-який символ, крім переносу рядка (якщо немає s) | /a.c/ | abc a-c | abc |
^ $ | Початок і кінець вводу (або рядка, з m) | /^\w+$/ | single | single |
[abc] | Один із перелічених символів | /[aeiou]/ | rhythm and blues | a |
[^abc] | Будь-який символ, якого немає в переліку | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 або більше, 1 або більше, 0 або 1 | /colou?r/ | color colour | color |
{n,m} | Від n до m разів | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Група захоплення | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Іменована група захоплення | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Група без захоплення | /(?:ab)+/ | ababab! | ababab |
a|b | Будь-яка зі сторін | /cat|dog/ | hotdog | dog |
\b | Межа слова | /\bcat\b/ | concat cat | cat |
(?=…) | Після якого йде (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Перед яким немає (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Будь-яка літера Unicode (потрібен u) | /\p{L}+/u | naïve 東京 | naïve |
Шість прапорців і що вони змінюють
g (global) знаходить усі збіги, а не зупиняється на першому; без нього в списку буде один запис. i ігнорує регістр. m (multiline) змушує ^ і $ збігатися на початку й у кінці кожного рядка, а не лише всього тексту, що потрібно для шаблону на кшталт пробілів наприкінці рядка. s (dotAll, додано в ES2018) дозволяє . збігатися і з розривами рядків. u (unicode) розглядає текст як кодові точки, тож емодзі враховується як один символ, і вмикає escape-послідовності властивостей, наприклад \p{L} для будь-якої літери будь-якого письма. y (sticky) збігається лише точно в поточній позиції; цей режим використовують токенізатори. У JavaScript також є d для індексів збігів і v для операцій над множинами в класах; цей тестер підтримує лише шість прапорців, наведених вище.
Під тестовим текстом для кожного збігу показано його індекс і групи. Нумеровані групи створюють звичайні дужки, (?:…) групує без захоплення, а (?<year>\d{4}) створює іменовану групу, яка відображається за назвою, як показує приклад з датою ISO. Меню Common patterns вставляє перевірені заготовки для адрес електронної пошти, URL, адрес IPv4, шістнадцяткових кольорів, UUID, повторюваних слів і пробілів наприкінці рядка. Шаблон для email сприймайте як грубу перевірку, а не валідацію: повна граматика адреси значно ширша, а єдина справжня перевірка — надіслати лист.
Ретроспективна перевірка (lookbehind) і катастрофічний бектрекінг
Lookaround-конструкції перевіряють, що оточує позицію, не споживаючи символів. Lookahead, (?=…) і (?!…), був у JavaScript завжди; lookbehind, (?<=…) і (?<!…), з’явився в ES2018 і потрапив у всі основні браузери, коли Safari 16.4 підтримав його у 2023 році. Тож (?<=\$)\d+ знаходить 42 у "$42" без знака долара. На відміну від багатьох інших рушіїв, JavaScript дозволяє lookbehind будь-якої довжини.
Рушій JavaScript використовує повернення (backtracking): коли шлях не вдається, він повертається і пробує альтернативи. Вкладені квантифікатори, як-от (a+)+$, дають йому експоненційну кількість способів розбити той самий текст, тож рядок із 30 літер a та x наприкінці може обробляться секундами, а кілька додаткових літер — годинами. Це катастрофічний backtracking, а на серверах він перетворюється на ReDoS, відмову в обслуговуванні; одне правило WAF з такою вадою вивело з ладу мережу Cloudflare приблизно на пів години 2 липня 2019 року. Оскільки цей тестер працює у вашій вкладці, такий шаблон може заблокувати сторінку; перезавантажте її та перепишіть шаблон так, щоб два квантифікатори не могли претендувати на одні й ті самі символи: використовуйте точніші класи, як-от [^,]* замість .*, або якорі. Для редагування самого тексту, а не пошуку збігів, дивіться текстові інструменти; більше утиліт для розробників у розділі інструменти для розробників.
Поширені запитання
- Чому регулярний вираз знаходить лише один збіг?
- Прапорець g вимкнено. Без нього рушій зупиняється після першого збігу. Увімкніть g, щоб побачити всі входження; прапорець y сам по собі теж знаходить кілька збігів, але лише коли вони йдуть один за одним впритул.
- Чи відповідає \d цифрам інших писемностей у JavaScript?
- Ні. У JavaScript \d означає лише 0–9, а \w — лише ASCII-літери, цифри й підкреслення, навіть із прапорцем u. Для інших писемностей використовуйте \p{Nd} або \p{L} з u.
- Чи працюватиме перевірений тут шаблон так само в Python або PHP?
- Базовий синтаксис переноситься, але деталі відрізняються: іменовані групи в Python записують як
(?P<name>…), PHP і Python підтримують посесивні квантифікатори, яких немає в JavaScript, а правила lookbehind різняться. Перевірте шаблон ще раз у потрібному рушії. - Як знайти буквальну крапку або дужку?
- Екрануйте його зворотною скісною рискою:
\.відповідає крапці, а\[— відкривній квадратній дужці. Усередині класу символів більшість знаків і так літеральні, тому[.]також відповідає лише крапці. - Чому сторінка зависла, поки я вводив шаблон?
- Імовірно, шаблон спричинив катастрофічний backtracking на вашому тексті. Перезавантажте сторінку, уникайте вкладених квантифікаторів, як-от
(.*)*або(a+)+, і робіть так, щоб кожна частина збігалася з якомога меншим фрагментом.