Пошук уроків, статей та іншого контенту
Застосуєте методи test, exec, search, match і matchAll для пошуку та аналізу збігів у JavaScript.
Для пошуку текстових збігів у JavaScript використовують регулярні вирази — об’єкти RegExp.
Регулярний вираз можна створити двома способами:
const firstPattern = /javascript/i;
const secondPattern = new RegExp("javascript", "i");Прапорець i означає, що регістр символів не враховується:
/javascript/i.test("JavaScript"); // trueНайпоширеніші методи пошуку збігів:
test() — перевіряє, чи існує збіг;
exec() — повертає детальну інформацію про один збіг;
search() — шукає позицію першого збігу в рядку;
match() — повертає збіги в рядку;
matchAll() — повертає ітератор з усіма збігами та їхніми групами.
test()Метод test() викликають у регулярного виразу. Він повертає логічне значення:
true, якщо збіг знайдено;
false, якщо збігу немає.
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailPattern.test("anna@example.com")); // true
console.log(emailPattern.test("invalid-email")); // falseЦей метод зручний для валідації:
const passwordPattern = /^(?=.*[A-Z])(?=.*\d).{8,}$/;
const password = "Secure123";
if (passwordPattern.test(password)) {
console.log("Пароль відповідає вимогам");
} else {
console.log("Пароль має містити щонайменше 8 символів, велику літеру та цифру");
}У регулярному виразі:
^ — початок рядка;
$ — кінець рядка;
(?=.*[A-Z]) — у рядку має бути велика літера;
(?=.*\d) — у рядку має бути цифра;
.{8,} — щонайменше 8 будь-яких символів.
test() із прапорцем gЯкщо регулярний вираз має прапорець g, він зберігає позицію наступного пошуку у властивості lastIndex.
const pattern = /cat/g;
console.log(pattern.test("cat cat")); // true
console.log(pattern.lastIndex); // 3
console.log(pattern.test("cat cat")); // true
console.log(pattern.lastIndex); // 7
console.log(pattern.test("cat cat")); // false
console.log(pattern.lastIndex); // 0Після невдалого пошуку lastIndex скидається до 0. Через це повторний виклик test() для одного й того самого регулярного виразу може дати інший результат.
Якщо потрібно виконувати незалежні перевірки, не використовуйте g або вручну скидайте lastIndex:
const pattern = /cat/g;
pattern.test("cat");
pattern.lastIndex = 0;
console.log(pattern.test("cat")); // trueexec()Метод exec() шукає один збіг і повертає масив із детальною інформацією або null, якщо збіг не знайдено.
const pattern = /(\d{4})-(\d{2})-(\d{2})/;
const result = pattern.exec("Дата: 2026-07-26");
console.log(result);Результат міститиме:
повний збіг у result[0];
значення першої групи в result[1];
значення другої групи в result[2];
значення третьої групи в result[3];
позицію збігу у властивості index;
початковий рядок у властивості input.
const pattern = /(\d{4})-(\d{2})-(\d{2})/;
const result = pattern.exec("Дата: 2026-07-26");
if (result !== null) {
console.log(result[0]); // 2026-07-26
console.log(result[1]); // 2026
console.log(result[2]); // 07
console.log(result[3]); // 26
console.log(result.index); // 6
}Групі можна надати ім’я за допомогою синтаксису (?<name>...).
const datePattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const result = datePattern.exec("Дата: 2026-07-26");
if (result !== null) {
console.log(result.groups.year); // 2026
console.log(result.groups.month); // 07
console.log(result.groups.day); // 26
}Іменовані групи роблять код зрозумілішим, особливо якщо регулярний вираз містить багато частин.
exec()Якщо регулярний вираз має прапорець g, exec() можна використовувати в циклі:
const pattern = /\b\d+\b/g;
const text = "У кошику 3 яблука, 12 груш і 5 апельсинів.";
let result;
while ((result = pattern.exec(text)) !== null) {
console.log(`Знайдено "${result[0]}" на позиції ${result.index}`);
}Результат:
Знайдено "3" на позиції 11
Знайдено "12" на позиції 21
Знайдено "5" на позиції 38Прапорець g важливий: без нього кожен виклик exec() повертатиме той самий перший збіг.
search()Метод search() викликають у рядка. Він повертає індекс першого збігу або -1, якщо збіг не знайдено.
const text = "Вивчаємо JavaScript";
console.log(text.search(/JavaScript/)); // 10
console.log(text.search(/Python/)); // -1Позиція символів у рядку починається з нуля.
Метод search() не повертає сам знайдений текст, а лише його позицію:
const text = "Телефон: +380501234567";
const phonePattern = /\+380\d{9}/;
const position = text.search(phonePattern);
if (position !== -1) {
console.log(`Номер знайдено на позиції ${position}`);
}Прапорець g не впливає на поведінку search(): метод завжди шукає позицію першого збігу.
const text = "cat cat";
console.log(text.search(/cat/g)); // 0Для отримання всіх збігів слід використовувати match() або matchAll().
match()Метод match() викликають у рядка. Його результат залежить від наявності прапорця g.
match() без прапорця gБез g метод повертає перший збіг і групи захоплення.
const text = "Код замовлення: AB-12345";
const pattern = /([A-Z]{2})-(\d+)/;
const result = text.match(pattern);
console.log(result[0]); // AB-12345
console.log(result[1]); // AB
console.log(result[2]); // 12345
console.log(result.index); // 16Це схоже на результат exec().
Якщо збігу немає, метод повертає null:
const result = "JavaScript".match(/Python/);
console.log(result); // nullmatch() із прапорцем gЯкщо використати g, метод повертає масив усіх повних збігів:
const text = "JavaScript, TypeScript і Java";
const result = text.match(/\b\w+Script\b/g);
console.log(result); // ["JavaScript", "TypeScript"]У такому режимі match() не повертає групи захоплення та позиції збігів. Повертаються лише повні збіги.
const text = "ID: A-10, ID: B-20";
const result = text.match(/([A-Z])-(\d+)/g);
console.log(result); // ["A-10", "B-20"]Значення груп A, 10, B і 20 у цьому результаті недоступні.
matchAll()Метод matchAll() повертає ітератор з усіма збігами. Він дає змогу отримати:
повний текст кожного збігу;
групи захоплення;
іменовані групи;
позицію кожного збігу.
Для matchAll() регулярний вираз має містити прапорець g.
const text = "ID: A-10, ID: B-20";
const pattern = /([A-Z])-(\d+)/g;
for (const result of text.matchAll(pattern)) {
console.log(result[0]); // A-10, потім B-20
console.log(result[1]); // A, потім B
console.log(result[2]); // 10, потім 20
console.log(result.index); // позиція кожного збігу
}Оскільки matchAll() повертає ітератор, його часто перетворюють на масив:
const text = "Температура: 18°C, вологість: 65%, тиск: 1012 hPa";
const pattern = /(\d+)(°C|%| hPa)/g;
const matches = [...text.matchAll(pattern)];
for (const match of matches) {
console.log({
value: match[0],
number: match[1],
unit: match[2],
position: match.index
});
}Вивід матиме приблизно такий вигляд:
{
value: "18°C",
number: "18",
unit: "°C",
position: 13
}
{
value: "65%",
number: "65",
unit: "%",
position: 27
}
{
value: "1012 hPa",
number: "1012",
unit: " hPa",
position: 39
}matchAll() з іменованими групамиconst text = "Імена: Anna <anna@example.com>, Oleh <oleh@example.com>";
const pattern = /(?<name>[A-Za-z]+) <(?<email>[^>]+)>/g;
for (const match of text.matchAll(pattern)) {
console.log(match.groups.name);
console.log(match.groups.email);
}Іменовані групи доступні через match.groups.
Використовуйте test():
const hasNumber = /\d/.test("Рядок 123");Використовуйте search():
const position = "Hello JavaScript".search(/JavaScript/);Використовуйте exec() або match() без g:
const result = /(\w+)@(\w+\.\w+)/.exec("user@example.com");Використовуйте match() із g:
const words = "one two three".match(/\w+/g);Використовуйте matchAll() із g:
const matches = [..."A-10 B-20".matchAll(/([A-Z])-(\d+)/g)];Розглянемо рядок із повідомленням, у якому потрібно знайти згадки користувачів, електронні адреси та хештеги.
const message = `
Привіт, @anna та @oleh!
Надішліть результати на anna@example.com.
Тема: #javascript і #regex
`;
const mentionPattern = /@[a-z]+\b/gi;
const emailPattern = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
const hashtagPattern = /#[a-z]+\b/gi;
console.log("Згадки:", message.match(mentionPattern));
console.log("Електронні адреси:", message.match(emailPattern));
console.log("Хештеги:", message.match(hashtagPattern));Результат:
Згадки: ["@anna", "@oleh"]
Електронні адреси: ["anna@example.com"]
Хештеги: ["#javascript", "#regex"]Тепер знайдемо всі згадки разом із їхніми позиціями:
const mentionPattern = /(?<username>@[a-z]+\b)/gi;
for (const match of message.matchAll(mentionPattern)) {
console.log({
username: match.groups.username,
position: match.index
});
}Найчастіше використовують такі прапорці:
g — глобальний пошук усіх збігів;
i — ігнорування регістру;
m — багаторядковий режим;
s — крапка . також відповідає символу перенесення рядка;
u — коректна робота з Unicode-символами;
y — пошук лише з позиції lastIndex;
d — додавання індексів груп до результату.
Приклад поєднання прапорців:
const pattern = /javascript/gi;
console.log("JavaScript javascript".match(pattern));
// ["JavaScript", "javascript"]Прапорці можна перевірити через властивості регулярного виразу:
const pattern = /javascript/gi;
console.log(pattern.global); // true
console.log(pattern.ignoreCase); // trueПрапорець m змінює поведінку якорів ^ і $. Без нього вони відповідають початку та кінцю всього рядка. З m вони також відповідають початку та кінцю кожного рядка.
const text = `first line
second line
third line`;
console.log(text.match(/^.+$/gm));
// ["first line", "second line", "third line"]Тут:
^ позначає початок кожного рядка;
$ позначає кінець кожного рядка;
. відповідає символам усередині рядка;
g знаходить усі рядки;
m вмикає багаторядковий режим.
Для роботи з Unicode часто використовують прапорець u та Unicode-властивості.
Наприклад, \p{L} відповідає будь-якій літері, а \p{N} — будь-якій цифрі:
const text = "JavaScript Україна 2026";
console.log(text.match(/\p{L}+/gu));
// ["JavaScript", "Україна"]
console.log(text.match(/\p{N}+/gu));
// ["2026"]Для Unicode-властивостей обов’язково потрібен прапорець u.
Перед написанням коду визначте, яку інформацію потрібно отримати:
Лише true або false
Використовуйте test().
Позицію першого збігу
Використовуйте search().
Перший збіг із групами
Використовуйте exec() або match() без g.
Усі повні збіги
Використовуйте match() із g.
Усі збіги, групи та позиції
Використовуйте matchAll() із g.
test()test() повертає тільки логічне значення:
const result = /\d+/.test("Код: 123");
console.log(result); // trueЩоб отримати сам текст збігу, використовуйте match(), exec() або matchAll().
match() із g, коли потрібні групиconst result = "A-10 B-20".match(/([A-Z])-(\d+)/g);
console.log(result); // ["A-10", "B-20"]Групи втрачаються. Якщо вони потрібні, використовуйте matchAll():
const result = [..."A-10 B-20".matchAll(/([A-Z])-(\d+)/g)];
console.log(result[0][1]); // A
console.log(result[0][2]); // 10g у matchAll()const text = "one two";
// Викличе помилку, оскільки регулярний вираз не має прапорця g
// text.matchAll(/\w+/);Правильний варіант:
const matches = text.matchAll(/\w+/g);search() із truesearch() повертає число. Якщо збіг починається з позиції 0, результатом буде 0, а не true.
const position = "JavaScript".search(/JavaScript/);
if (position !== -1) {
console.log("Збіг знайдено");
}Перевірка через if (position) була б помилковою, оскільки 0 є хибним значенням.
const pattern = /word/g;
console.log(pattern.test("word")); // true
console.log(pattern.test("word")); // falseПричина — стан lastIndex. Для одноразових перевірок краще не додавати g:
const pattern = /word/;
console.log(pattern.test("word")); // true
console.log(pattern.test("word")); // truenullЯкщо збіг не знайдено, match() і exec() можуть повернути null:
const result = "JavaScript".match(/Python/);
if (result !== null) {
console.log(result[0]);
}Без перевірки звернення до result[0] спричинить помилку.
Регулярний вираз /.+/ може захопити значно більше тексту, ніж потрібно. Формулюйте шаблон якомога точніше та перевіряйте його на граничних випадках:
порожній рядок;
різний регістр;
кілька збігів;
перенесення рядка;
спеціальні символи;
некоректні дані.
test() перевіряє наявність збігу та повертає true або false.
exec() повертає один збіг, його групи, індекс і вхідний рядок.
search() повертає позицію першого збігу або -1.
match() без g повертає перший збіг разом із групами.
match() із g повертає масив усіх повних збігів без груп.
matchAll() повертає всі збіги разом із групами та позиціями.
Глобальний прапорець g впливає на стан регулярного виразу через lastIndex.
Для matchAll() потрібен прапорець g.
Для перевірки результатів search(), match() і exec() потрібно враховувати значення -1 або null.