Регулярні вирази для людей: практичний посібник
Регулярні вирази (regex) мають репутаційну проблему. Вони виглядають так, наче хтось заснув на клавіатурі: ^[\w.-]+@[\w-]+\.[\w.]+$. Вони з'являються в переглядах коду, текстових редакторах, інструментах пошуку та валідації форм. Розробники або люблять їх, або уникають повністю.
Правда десь посередині. Regex справді потужний. Він також справді заплутаний на початку. Але вам не потрібно опановувати кожну незрозумілу функцію, щоб отримати практичну користь. Жменька шаблонів охоплює переважну більшість реальних сценаріїв.
Що насправді робить Regex
Регулярний вираз — це шаблон, що описує набір рядків. Ви передаєте його інструменту пошуку, і він знаходить кожен рядок, що відповідає шаблону. Думайте про нього як про дуже точний пошуковий запит.
Звичайний пошук: знайти точно "привіт" Пошук Regex: знайти все, що схоже на email-адресу, номер телефону, дату, URL або будь-який інший шаблон, який ви можете описати.
Чи знали ви? Регулярні вирази були винайдені математиком Стівеном Кліні у 1956 році як нотація для опису «регулярних мов» у теорії формальних мов. Вони потрапили в обчислювальну техніку через ранні Unix-текстові редактори в 1960-70-х роках.
Будівельні блоки
Буквальні символи
Найпростіший regex — це просто буквальний текст. Шаблон hello відповідає рядку "hello". Нічого складного.
Крапка (.) — будь-який одиночний символ
Крапка відповідає будь-якому одиночному символу (крім нового рядка).
h.tвідповідає "hat," "hit," "hot," "hut" і навіть "h3t"
Класи символів ([]) — конкретні символи
Квадратні дужки визначають набір дозволених символів у цій позиції.
[aeiou]відповідає будь-якій одиночній голосній[0-9]відповідає будь-якій цифрі[A-Za-z]відповідає будь-якій букві (верхній або нижній регістр)[^0-9]відповідає будь-якому символу, що НЕ є цифрою (^у дужках означає "не")
Квантифікатори — кількість
Ці символи контролюють повторення:
| Символ | Значення | Приклад | Відповідності |
|---|---|---|---|
* |
Нуль або більше | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
Один або більше | ab+c |
"abc," "abbc," "abbbc" (не "ac") |
? |
Нуль або один | colou?r |
"color" та "colour" |
{3} |
Рівно 3 | a{3} |
"aaa" |
{2,4} |
Від 2 до 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Якорі — позиція
^на початку означає "початок рядка"$в кінці означає "кінець рядка"^hello$відповідає лише точному рядку "hello", а не "say hello" або "hello world"
Скорочені класи
Поширені класи символів мають скорочення:
| Скорочення | Еквівалент | Значення |
|---|---|---|
\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)+відповідає "ab," "abab," "ababab"(\d{3})-(\d{4})відповідає "555-1234" і захоплює "555" та "1234" окремо
Вертикальна риска (|) — або
Вертикальна риска означає "або".
cat|dogвідповідає "cat" або "dog"(jpg|png|gif)відповідає будь-якому з цих трьох розширень зображень
Практичні шаблони для використання вже сьогодні
Знайти email-адресу (простий варіант)
[\w.-]+@[\w-]+\.[\w.]+
Пояснення:
[\w.-]+— один або більше словесних символів, крапок або дефісів (локальна частина)@— буквальний знак @[\w-]+— один або більше словесних символів або дефісів (домен)\.— буквальна крапка (екранована, бо.є спеціальним символом)[\w.]+— один або більше словесних символів або крапок (домен верхнього рівня)
Увага Валідація email за допомогою regex сумнозвісно важка. Простий шаблон вище охоплює 99% реальних email-адрес, але не обробляє кожен граничний випадок, визначений у специфікації RFC. Для виробничої валідації використовуйте бібліотеку валідації email вашої мови програмування.
Знайти номер телефону (американський формат)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Відповідає:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Знайти URL
https?://[\w.-]+(/[\w./-]*)?
Відповідає:
Знайти дату (РРРР-ММ-ДД)
\d{4}-\d{2}-\d{2}
Відповідає: 2026-03-23, 1999-12-31 тощо.
Знайти дублікати слів
\b(\w+)\s+\1\b
Відповідає повторюваним словам, таким як "the the" або "is is". \1 посилається на те, що було захоплено першою групою.
Знайти адресу IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Відповідає шаблонам, наприклад 192.168.1.1 або 10.0.0.255.
Поради для написання Regex
1. Починайте просто, потім уточнюйте
Не намагайтесь написати ідеальний regex з першої спроби. Починайте з широкого шаблону, тестуйте на своїх даних і поступово звужуйте.
2. Завжди тестуйте
Regex легко написати неправильно. Пропущений квантифікатор або неекранована крапка можуть повністю змінити те, що відповідає шаблону. Завжди тестуйте шаблон на реальних даних перед використанням у продакшні.
3. Екрануйте спеціальні символи
Якщо потрібно знайти буквальну крапку, дужку, квадратну дужку або інший спеціальний символ, екрануйте його зворотною скісною рискою: \., \(, \[.
4. Використовуйте коментарі та іменовані групи
У складних шаблонах використовуйте іменовані групи та коментарі (де підтримується), щоб зробити regex читабельним. Ваше майбутнє "я" подякує.
5. Знайте, коли не використовувати Regex
Regex — неправильний інструмент для синтаксичного аналізу HTML, XML, JSON або будь-якої вкладеної структури. Для цього використовуйте відповідний парсер.
Порада Тестуйте та налагоджуйте ваші шаблони regex у реальному часі: Як тестувати шаблони Regex. Вставте свій шаблон і тестові дані, і бачте збіги підсвіченими миттєво.
Починайте тестувати regex прямо зараз:
Безкоштовно, миттєвий зворотний зв'язок і не потрібна реєстрація.