Регулярні вирази мають репутацію випадкового шуму. Шаблон на кшталт ^[\w.-]+@[\w-]+\.\w{2,}$ може виглядати так, ніби кіт пройшовся по клавіатурі. Але за криптичним синтаксисом ховається надзвичайно елегантна ідея: лаконічна мова для опису шаблонів у тексті.
Чи валідуєте ви введення у формах, шукаєте в лог-файлах, очищуєте дані чи виконуєте пошук і заміну по кодовій базі, regex — один з найуніверсальніших інструментів у наборі розробника. І вам не потрібно запам'ятовувати кожну маловідому функцію, щоб отримати від нього реальну користь. Кілька будівельних блоків покривають переважну більшість практичних випадків використання.
Що насправді робить regex
Регулярний вираз (regex або regexp) — це шаблон, що описує множину рядків. Ви надаєте його пошуковому рушію — у вашій мові програмування, текстовому редакторі чи інструменті командного рядка — і він знаходить кожен рядок, що відповідає шаблону.
Уявіть його як покращений пошуковий запит:
- Звичайний пошук: знайти точне слово «error»
- Regex пошук: знайти все, що схоже на IP-адресу, дату, email-адресу або будь-яку структуру, яку можна описати
Regex був винайдений математиком Стівеном Кліні у 1956 році та увійшов у комп'ютерні науки через текстові редактори Unix у 1960-х. Сьогодні він підтримується практично в кожній мові програмування та текстовому редакторі.
Будівельні блоки
Літеральні символи
Найпростіший regex — це звичайний текст. Шаблон hello відповідає рядку «hello» де б він не зустрічався. Нічого особливого.
Крапка (.) — будь-який символ
Крапка відповідає будь-якому одному символу, крім нового рядка.
h.tвідповідає «hat», «hit», «hot», «h3t» і навіть «h t»
Класи символів ([])
Квадратні дужки визначають набір дозволених символів на одній позиції.
[aeiou]— будь-яка голосна[0-9]— будь-яка цифра[A-Za-z]— будь-яка літера[^0-9]— будь-який символ, що НЕ є цифрою (^всередині дужок означає «не»)
Скорочені класи
| Скорочення | Значення | Еквівалент |
|---|---|---|
\d |
Будь-яка цифра | [0-9] |
\w |
Символ слова | [A-Za-z0-9_] |
\s |
Пробіл | [ \t\n\r] |
\D |
Не цифра | [^0-9] |
\W |
Не символ слова | [^A-Za-z0-9_] |
\S |
Не пробіл | [^ \t\n\r] |
Квантифікатори — скільки разів
Квантифікатори контролюють, скільки разів повинен з'явитися попередній елемент.
| Символ | Значення | Приклад | Відповідає |
|---|---|---|---|
* |
Нуль або більше | ab*c |
«ac», «abc», «abbc» |
+ |
Один або більше | ab+c |
«abc», «abbc» (не «ac») |
? |
Нуль або один | colou?r |
«color» і «colour» |
{3} |
Рівно 3 | \d{3} |
«123», «456» |
{2,4} |
Від 2 до 4 | \d{2,4} |
«12», «123», «1234» |
Якорі — позиція
^— початок рядка (або рядка тексту з прапорцемm)$— кінець рядка (або рядка тексту)\b— межа слова
Шаблон ^\d{4}$ відповідає рядку, що складається рівно з чотирьох цифр, як «2026», але не «abc2026» або «2026xyz».
Групи та чергування
(abc)— захоплює «abc» як групуa|b— відповідає «a» або «b»(cat|dog)— відповідає «cat» або «dog»
Групи також дозволяють застосовувати квантифікатори до послідовностей: (ha)+ відповідає «ha», «haha», «hahaha».
Поширені практичні шаблони
Валідація email (базова)
^[\w.-]+@[\w-]+\.\w{2,}$
Це відповідає user@example.com, first.last@company.co.uk (частково) та відхиляє рядки без @ або домену.
Важливо: Ідеальна валідація email-адрес за допомогою regex відомо складна — повна специфікація RFC 5322 надзвичайно комплексна. Для продакшн-систем використовуйте базовий regex для перевірки формату, а потім підтвердіть адресу, надіславши лист підтвердження.
Пошук номера телефону
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Це обробляє формати на кшталт +1 555 123 4567, 555-123-4567 та (555) 123-4567.
Пошук URL
https?://[\w.-]+(/[\w./?&=-]*)?
Відповідає https://example.com, http://example.com/path?q=hello.
Пошук дати (РРРР-ММ-ДД)
\d{4}-\d{2}-\d{2}
Відповідає 2026-03-29, 1999-12-31. Зауважте: це перевіряє лише формат, а не валідність — також відповідатиме 9999-99-99.
Прапорці, що змінюють поведінку
Більшість рушіїв regex підтримують прапорці, що змінюють спосіб застосування шаблону:
| Прапорець | Назва | Ефект |
|---|---|---|
g |
Глобальний | Знайти всі збіги, а не тільки перший |
i |
Нечутливий до регістру | hello відповідає «Hello», «HELLO» тощо |
m |
Багаторядковий | ^ і $ відповідають початку/кінцю кожного рядка |
s |
Dotall | . також відповідає символам нового рядка |
У JavaScript прапорці додаються після закриваючого слеша: /hello/gi. У Python вони передаються як аргументи: re.findall(r"hello", text, re.IGNORECASE).
Коли regex зайвий
Regex потужний, але не завжди правильний інструмент:
- Аналіз HTML або XML. Використовуйте належний DOM-парсер. Regex не може надійно обробляти вкладені теги.
- Аналіз JSON. Використовуйте
JSON.parse()або еквівалент. Regex зламається на граничних випадках. - Складна валідація. Якщо ваш шаблон займає кілька рядків і потрібно п'ять хвилин, щоб його прочитати, подумайте про написання процедурного коду валідації.
- Прості рядкові операції. Якщо вам потрібен лише
startsWith(),includes()абоsplit(), звичайні рядкові методи зрозуміліші та швидші.
Поширені підводні камені
- Забули екранувати спеціальні символи. Крапка
.відповідає будь-якому символу. Для літеральної крапки використовуйте\.. Те саме для(,),[,],+,*,?,{,},^,$,|та\. - Жадібний vs лінивий збіг. За замовчуванням
.*жадібний — відповідає якомога більше. Додайте?для лінивого режиму:.*?відповідає якомога менше. Це важливо при витягуванні вмісту між розділювачами. - Катастрофічний зворотний відкат. Вкладені квантифікатори на кшталт
(a+)+можуть змусити рушій спробувати експоненціальну кількість шляхів на певних входах, заморозивши вашу програму. Уникайте вкладеного повторення на шаблонах, що перетинаються. - Забуті якорі. Без
^і$ваш шаблон відповідає підрядкам.\d{3}відповідає «123» всередині «abc12345». Використовуйте^\d{3}$, якщо потрібен точний збіг.
Далі
Найкращий спосіб вивчити regex — експериментувати. Введіть шаблон, вставте тестовий текст і подивіться, що підсвічується. Коригуйте та ітеруйте, поки не зрозумієте, як працює кожен елемент.
- Як тестувати шаблони Regex — інтерактивне керівництво з прикладами
- Тестер Regex — вставте шаблон і тестові дані, дивіться збіги підсвіченими в реальному часі
