Тестер регулярних виразів: створення та налагодження шаблонів на власному тексті
Регулярний вираз — це мініатюрна мова для опису форми тексту. Замість запитання «чи є тут це конкретне слово?», regex дозволяє запитати «чи є тут рядок, що виглядає ось так?». Саме це робить його потужним для пошуку, валідації, вилучення та заміни тексту в редакторах коду, лог-файлах, полях введення форм і скриптах. І саме через це помилитися так легко, адже шаблон, що правильно читається у вашій голові, може непомітно збігатися з надто великою, надто малою кількістю збігів або не знаходити нічого взагалі.
Ось чому інтерактивне тестування краще за здогадки. Коли ви вводите шаблон і бачите, як збіги підсвічуються на реальному тексті, ви отримуєте миттєвий зворотний зв'язок: що було знайдено, що вислизнуло і яка група захоплення взяла який фрагмент. Наш тестер регулярних виразів працює повністю у вашому браузері. Ваш шаблон і зразок тексту ніколи не залишають сторінку, тому ви можете вставляти рядки логів, адреси електронної пошти або виробничі дані, не відправляючи нічого на сервер.

Будівельні блоки, які варто знати
Більшість повсякденних шаблонів складається з невеликого набору елементів. Вивчіть їх — і ви зможете читати більшість регулярних виразів, що трапляються на практиці.
Класи символів описують набір дозволених символів. [aeiou] збігається з будь-якою одиничною голосною, [0-9] — з однією цифрою, а [a-zA-Z] — з однією літерою. Знак вставки всередині дужок заперечує набір, тому [^0-9] означає «будь-який символ, що не є цифрою». Скорочення економлять час: \d — це цифра, \w — символ слова (літери, цифри, підкреслення), \s — пробільний простір, а крапка . збігається майже з будь-яким одиничним символом.
Квантифікатори вказують, скільки разів може повторюватися попередній елемент. * означає нуль або більше, + — один або більше, а ? — нуль або один (необов'язково). Для точних кількостей {3} означає рівно три, а {2,4} — від двох до чотирьох. Тому \d{4} збігається з чотиризначним роком, а colou?r збігається з обома варіантами написання.
Якорі прив'язують шаблон до позиції, а не до символу. ^ збігається з початком тексту, $ — з кінцем, а \b позначає межу слова. Шаблон ^Error збігається лише з рядками, що починаються з «Error», — саме те, що потрібне при скануванні логів.
Групи огортають частину шаблону в дужки, як для застосування квантифікатора до кількох символів одночасно, так і для захоплення знайденого тексту для подальшого використання. У (\d{4})-(\d{2})-(\d{2}) кожна група захоплює компонент дати, який можна витягти пізніше. Чергування з вертикальною рискою діє як «або»: cat|dog|fish збігається з будь-яким із трьох слів.
Шаблони, до яких ви будете звертатися насправді
Кілька типових завдань охоплюють більшість реальної роботи. Щоб знайти щось схоже на електронну адресу, [\w.+-]+@[\w-]+\.[\w.-]+ є практичною відправною точкою; повна валідація електронної пошти за формальною специфікацією є нотабельно складною, і нестрогий шаблон зазвичай є правильним вибором для виділення кандидатів, а не відхилення користувачів.
Для чисел \d+ захоплює послідовності цифр, а -?\d+(\.\d+)? збігається з необов'язковим знаком мінус і десятковими. Щоб видалити початкові та кінцеві пробіли, знайдіть ^\s+|\s+$ і замініть на нічого. Щоб знайти дублюючі слова, шаблон із зворотнім посиланням \b(\w+)\s+\1\b збігається зі словом, за яким слідує воно саме, де \1 посилається назад на першу захоплену групу.

Прапорці змінюють поведінку пошуку збігів
Прапорці — це перемикачі, що модифікують весь шаблон. Прапорець global (g) знаходить усі збіги замість зупинки на першому — це те, що потрібне для підсвічування всіх входжень. Прапорець case-insensitive (i) дозволяє шаблону error збігатися і з «Error», і з «ERROR». Прапорець multiline (m) змінює поведінку ^ і $ так, що вони збігаються на початку і в кінці кожного рядка, а не лише всього тексту, що є необхідним для посторядкової роботи з логами. Інші корисні прапорці: s (dotall, що дозволяє крапці збігатися з символами нового рядка) і u для повної підтримки Unicode.
Діалекти регулярних виразів дещо відрізняються залежно від мови
Regex — це сімейство діалектів, а не єдиний фіксований стандарт. JavaScript, Python, PCRE (PHP), Java, .NET, Go і Rust узгоджені в базовому синтаксисі, але розходяться на краях: підтримка look-behind, синтаксис іменованих груп ((?<name>...) проти (?P<name>...)), escaped-властивості Unicode та набір доступних прапорців — все це варіюється. Шаблон, що працює в одному рушії, може потребувати невеликого доопрацювання в іншому, тому варто тестувати на тому діалекті, який ви реально використовуєте. Коли шаблон готовий, наші інші інструменти для розробників і текстові інструменти допоможуть із супутньою роботою з очищення, кодування та перетворення щойно знайдених даних.
Часті запитання
Чи передається мій текст на сервер?
Ні. Тестер регулярних виразів працює повністю у вашому браузері. Ваш шаблон і зразок тексту залишаються на вашому пристрої та ніколи не завантажуються, тому безпечно вставляти чутливі дані.
Який діалект regex використовує цей інструмент?
Він використовує рушій регулярних виразів JavaScript, вбудований у ваш браузер. Базовий синтаксис відповідає тому, що ви знаєте з більшості мов, хоча деякі розширені функції дещо відрізняються від PCRE, Python або .NET.
У чому різниця між жадібним і лінивим пошуком збігів?
За замовчуванням квантифікатори є жадібними і захоплюють якомога більше тексту. Додавання знаку питання робить їх лінивими, і вони захоплюють якомога менше. Наприклад, шаблон «крапка зірочка» є жадібним, а «крапка зірочка знак питання» — лінивим.
Як знайти буквальний спеціальний символ?
Екрануйте його зворотною косою рискою. Щоб знайти справжню крапку, напишіть «зворотня коса риска крапка». Те саме стосується інших метасимволів: дужок, квадратних дужок, знака плюса та знака питання.
Чому мій шаблон нічого не знаходить?
Типові причини: відсутній прапорець global, якорі, що прив'язують пошук до неправильної позиції, не екранований спеціальний символ або жадібні квантифікатори, що виходять за межу, яку ви очікували. Тестуйте частинами, щоб знайти причину.
Чи можна захоплювати частини збігу?
Так. Огорніть частину шаблону в дужки, щоб створити групу захоплення. Кожна група звітується окремо, що дозволяє вилучати поля, наприклад рік, місяць і день із дати.
