Тестер регулярних виразів
Напишіть шаблон, спостерігайте, як він збігається з вашим текстом під час введення, і подивіться, що саме робить кожен токен. Групи захоплення, попередній перегляд заміни та перевірка сумісності з PCRE й Python.
Шаблон
Ваш регулярний вираз
Пишіть лише тіло шаблону — без обрамляючих слешів. Усе оновлюється під час введення.
Змінює лише перевірку сумісності — зіставлення завжди виконується рушієм JavaScript вашого браузера.
Пресети
Тестовий текст
Текст для зіставлення
Вставте реальні дані — рядок логу, конфіг, експорт чату. Нічого не виходить за межі вашого браузера.
символів: 794 · рядків: 14
Wespner ops log — node eu-fra-03 Ticket #4821 opened by [email protected], escalated to [email protected]. Billing contact: [email protected] (invoice WX-2026-0917). Panel: https://panel.wespner.eu/server/eu-fra-03/console Mirror: http://mirror.wespner.eu:8080/backups/latest.tar.zst Node IP 185.199.110.153, gateway 10.0.0.1, bad entry 999.1.1.1 in the allowlist. Server UUID 9f2c1a7e-3b44-4d8e-9c21-7a5f0b6e2d13 (instance 550e8400-e29b-41d4-a716-446655440000). Chat export: [12:04] Steve_84: this build is hell to maintain, honestly [12:05] Alex_MC: rotate the panel password and open a shell on the class-4 node [12:06] Steve_84: damn, the ass-end of that config is unreadable [12:07] Notch_Fan: <img src=x onerror=alert(1)> nice try [12:08] Alex_MC: harassment report filed, see /docs/rcon
Групи захоплення
Кожен збіг, з групами й позиціями
Нумеровані групи походять зі звичайних ( ). Іменовані групи походять з (?<name>…) і перелічуються окремо.
Введіть шаблон, щоб побачити збіги та їхні групи захоплення.
Режим пояснення
Що насправді робить кожна частина шаблону
Читайте згори вниз — саме в такому порядку рушій це читає. Відступи показують вкладеність усередині груп.
(?<user>Named capturing group “user”, also group number 1. Refer to it as $<user> in a replacement, or \k<user> in the pattern.[\w.+-]Any single character that is a word character (letter, digit or underscore), “.”, “+” or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.@The character “@”, matched literally.(?<domain>Named capturing group “domain”, also group number 2. Refer to it as $<domain> in a replacement, or \k<domain> in the pattern.(?:Non-capturing group: groups tokens together for a quantifier or an alternation without storing what it matched, so it does not consume a group number.[\w-]Any single character that is a word character (letter, digit or underscore) or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.\.The character “.”, matched literally. The backslash strips any special meaning it would otherwise have.)Closes the group opened above.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.[a-z]Any single character that is anything from “a” to “z”.{2,}Repeats the previous token at least 2 times, with no upper limit. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.giFlags: g finds every match instead of stopping at the first; i ignores letter case.Заміна
Попередній перегляд пошуку й заміни
Використовуйте $1, $2 для нумерованих груп, $<name> для іменованих, $& для всього збігу й $$ для буквального знака долара.
Результат
Введіть шаблон, щоб побачити попередній перегляд заміни.
Чесна примітка
Ця сторінка не запускає PCRE чи Python
Тут є лише один рушій regex: вбудований у ваш браузер, що реалізує діалект JavaScript. Вибір PCRE чи Python не перемикає рушії й не може — у цій вкладці не працює ні PCRE, ні CPython.
Натомість налаштування діалекту перевіряє ваш шаблон на конструкції, що пишуться інакше, поводяться інакше чи просто не існують в обраному діалекті. Сприймайте збіги вище як результати JavaScript, а список праворуч — як «що вас вкусить, коли ви вставите це в PHP чи Python».
Еквівалентний виклик
const re = /(?<user>[\w.+-]+)@(?<domain>(?:[\w-]+\.)+[a-z]{2,})/gi;
for (const m of text.matchAll(re)) console.log(m);A literal is fine when the pattern is fixed. Building one from a variable needs new RegExp(src, flags) — and the source escaped first.
Перевірка сумісності
Сумісність із JavaScript
Евристика — шаблон скановано як текст, тож конструкція, написана всередині класу символів, усе одно може бути повідомлена.
Шпаргалка
Жадібний проти лінивого
Найпоширеніша причина того, що шаблон «збігається із зайвим».
<.*> щодо <b>bold</b> збігається з усім рядком, а не з <b>. * і + жадібні: вони захоплюють усе, що можуть, і віддають символи назад лише коли решта шаблону провалюється.
Додайте ?, щоб зробити квантифікатор лінивим — <.*?> зупиняється на першому >. Зазвичай ще краще: скажіть те, що справді маєте на увазі, <[^>]*>, який узагалі не може перетнути роздільник і не відкочується.
Шпаргалка
Якорі й межі
^ і $ — це початок і кінець рядка — доки не додати прапорець m, тоді вони стають початком і кінцем кожного рядка. Забути m у багаторядковому конфігураційному файлі — ось чому шаблон для одного рядка раптом нічого не знаходить.
\b — це межа слова нульової ширини, не символ. \bcat\b збігається з cat, але не з concatenate. Усередині класу символів [\b] означає backspace замість цього — справжня пастка.
Шаблону, що має відповідати всьому вводу, потрібні обидва якорі. Сам по собі ^\d+ охоче збігається з початком 123abc.
Шпаргалка
Катастрофічний відкат (backtracking)
Вкладені квантифікатори, де внутрішня й зовнішня частини можуть збігатися з тим самим текстом — (a+)+$, (\w+\s?)*$, (\d+)*x — дають рушію експоненційно багато способів розбити ввід. На тексті, що не проходить, кожен додатковий символ приблизно подвоює роботу, тож 30 символів можуть зайняти хвилини.
Виправлення — прибрати неоднозначність: (a+)+ стає a+; (\w+\s?)* стає \w+(?:\s\w+)*. Там, де ваш рушій це підтримує, атомарна група (?>…) чи присвійний квантифікатор a++ повністю забороняє відкат — вони є в PCRE та Python 3.11+, але не в JavaScript.
Цей тестер виконує зіставлення у Web Worker з обмеженням часу, тож несамовитий шаблон переривається, а не заморожує вкладку. У вашого продакшн-сервера такої страховки немає.
Шпаргалка
Фільтри слів і проблема Scunthorpe
Список слів без меж збігається всередині невинних слів. Класичний випадок — англійське місто Scunthorpe, чиї мешканці роками не могли зареєструватися в сервісах через чотири літери всередині назви.
Ближче до життя: hell збігається з shell, ass — з class і password, doc — з document. Обгортання альтернації в \b(?:…)\b виправляє більшість цього. Це не виправить навмисного обходу (h e l l, h3ll), а гонитва за цим за допомогою regex створює більше хибних спрацьовувань, ніж запобігає — тому справжня модерація поєднує невеликий консервативний regex із перевіркою людиною.
Шпаргалка
Екранування, класи й крапка
Усередині [ ] більшість метасимволів втрачають свою силу: [.+*] — це три звичайні символи. Особливими залишаються лише ^ (на першій позиції), - (між символами) і зворотна коса риска, а ] потрібно екранувати.
Крапка означає «будь-який символ, крім розриву рядка», доки не додати s. У шаблоні IP чи версії неекранована крапка збігається з будь-чим — 1.2.3.4 також збігається з 1x2y3z4.
Коли складаєте шаблон із вводу користувача, спершу екрануйте його. У JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). У PHP — preg_quote(), у Python — re.escape().
Шпаргалка
Групи, які вам, імовірно, не потрібно захоплювати
Кожна ( ) зберігає свій збіг і перенумеровує все, що йде після неї. Якщо групування потрібне лише для альтернації чи квантифікатора, використовуйте (?:…) — це зберігає ваш $1 стабільним, коли пізніше додасте групу перед ним.
Іменовані групи (?<user>…) повністю переживають перевпорядкування і читаються значно краще в рядку заміни: $<user> замість $3. У Python вони пишуться (?P<user>…).
Керуєте власним ігровим сервером?
Ігрові сервери Wespner із захистом від DDoS, дисками NVMe та активацією за кілька хвилин.