Learn JavaScript

matchAll() - метод для получения всех совпадений строки в JavaScript

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 для получения всех совпадений по регулярному выражению. Он особенно полезен, когда для каждого совпадения нужны не только найденные значения, но и индексы, группы и другая служебная информация.