matchAll() ищет все совпадения строки с регулярным выражением и возвращает итератор результатов.
Этот метод особенно полезен, когда нужно получить не просто все найденные строки, а ещё и их индексы, группы и другие данные.
Синтаксис
str.matchAll(regexp)
Метод вызывается у строки и возвращает итератор.
Обычно результат превращают в массив через Array.from() или оператор ....
Как работает matchAll()
const text = "a1 b2 c3";
const matches = Array.from(text.matchAll(/\d/g));
console.log(matches.map((m) => m[0])); // ["1", "2", "3"]
Каждый элемент результата похож на то, что возвращает match() без флага g: там есть найденный текст, индекс и группы.
Что возвращает matchAll()
matchAll() возвращает не массив, а итератор.
Поэтому такой результат обычно разворачивают:
const text = "a1 b2 c3";
console.log([...text.matchAll(/\d/g)].map((m) => m[0])); // ["1", "2", "3"]
Если нужно, можно получить индекс каждого совпадения:
const text = "a1 b2 c3";
for (const match of text.matchAll(/\d/g)) {
console.log(match[0], match.index);
}
Флаг g обязателен
Если передать регулярное выражение без флага g, JavaScript выбросит ошибку.
// "abc123".matchAll(/\d+/); // TypeError
Правильно так:
const text = "abc123";
console.log([...text.matchAll(/\d+/g)].map((m) => m[0])); // ["123"]
Это одно из самых важных правил работы с matchAll().
Работа с группами
matchAll() особенно удобен, когда в регулярном выражении есть группы.
const text = "id=42 code=99";
for (const match of text.matchAll(/(\w+)=(\d+)/g)) {
console.log(match[0]); // полное совпадение
console.log(match[1]); // первая группа
console.log(match[2]); // вторая группа
console.log(match.index);
}
Именно в таких случаях matchAll() часто удобнее, чем match() с флагом g.
Если совпадений нет
Если совпадений нет, matchAll() вернёт пустой итератор.
const text = "hello";
console.log([...text.matchAll(/\d/g)]); // []
Это удобно: здесь нет null, как у match().
Когда это полезно
matchAll() удобно использовать, когда:
- нужно получить все совпадения, а не только первое
- важны индексы найденных фрагментов
- нужно работать с группами регулярного выражения
Пример:
const text = "x=10 y=20";
const result = Array.from(text.matchAll(/(\w)=(\d+)/g));
console.log(result[0][1]); // "x"
console.log(result[0][2]); // "10"
matchAll() и match()
match() с флагом g возвращает просто массив найденных строк:
const text = "a1 b2 c3";
console.log(text.match(/\d/g)); // ["1", "2", "3"]
matchAll() возвращает более подробные результаты:
const text = "a1 b2 c3";
console.log([...text.matchAll(/\d/g)].map((m) => ({ value: m[0], index: m.index })));
Если нужны только найденные значения, часто хватает match(). Если нужны группы и индексы для всех совпадений, удобнее matchAll().
Частые ошибки
Забывать, что matchAll() возвращает итератор, а не массив
const text = "a1 b2";
console.log(text.matchAll(/\d/g));
Чтобы получить обычный массив, нужно использовать Array.from() или [...].
Передавать regex без g
// "abc123".matchAll(/\d+/); // TypeError
Для matchAll() глобальный флаг обязателен.
Ждать null при отсутствии совпадений
const text = "hello";
console.log([...text.matchAll(/\d/g)]); // []
В отличие от match(), здесь будет пустой массив после разворачивания, а не null.
Быстрая памятка
matchAll()ищет все совпадения по регулярному выражению- метод возвращает итератор
- для regex обязателен флаг
g - удобно получать индексы и группы для всех совпадений
- если совпадений нет, после разворачивания получится пустой массив
Коротко
matchAll() - это метод строки в JavaScript для получения всех совпадений по регулярному выражению. Он особенно полезен, когда для каждого совпадения нужны не только найденные значения, но и индексы, группы и другая служебная информация.