Прапорці:
| Прапорець | Що робить |
|---|---|
g |
шукати всі збіги, а не перший |
i |
без урахування регістру |
m |
^ і $ - початок і кінець кожного рядка тексту |
s |
. збігається й з переносом рядка |
u |
режим Unicode: коректні символи поза BMP, \p{...} |
v |
розширений Unicode-режим: операції над множинами в класах, властивості рядків |
y |
«липкий»: збіг лише точно з позиції lastIndex |
d |
індекси груп у match.indices |
Іменовані групи:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const { year, month } = '2026-10-04'.match(re).groups;
'2026-10-04'.replace(re, '$<day>.$<month>.$<year>'); // "04.10.2026"
matchAll - усі збіги з групами й позиціями:
for (const m of 'a1 b22 c333'.matchAll(/(?<letter>[a-z])(?<digits>\d+)/g)) {
console.log(m.groups.letter, m.groups.digits, m.index);
}
Вимагає прапорець g, інакше кидає TypeError.
Lookbehind і lookahead - умова на сусідній текст, яка не входить у збіг:
'ціна: 100 грн'.replace(/(?<=ціна: )\d+/, '200'); // "ціна: 200 грн"
/\d+(?= грн)/.exec('100 грн')[0]; // "100"
/(?<!\$)\b\d+/; // число, перед яким немає $
Заміна функцією:
'привіт світ'.replace(/\p{L}+/gu, (word) => word[0].toUpperCase() + word.slice(1));
// "Привіт Світ"
Unicode і кирилиця: \w - лише [A-Za-z0-9_], українські літери в нього не входять. Для літер будь-якої мови - \p{L} з прапорцем u чи v; \p{Script=Cyrillic} - лише кирилиця.
Пастка з g і test(): регулярний вираз з прапорцем g зберігає lastIndex між викликами:
const re = /a/g;
re.test('aa'); // true
re.test('aa'); // true
re.test('aa'); // false - пошук почався з кінця рядка
Для перевірки «чи є збіг» прапорець g не потрібен.
Безпека: вирази з вкладеними квантифікаторами ((a+)+$) на зловмисному введенні виконуються експоненційно довго (ReDoS) і блокують головний потік. Регулярні вирази з користувацького введення будувати не можна без екранування, а для складного розбору краще парсер.