логотип PurpleSchool
Иконка входа
Вход
логотип PurpleSchool

Как работает метод matchAll() - JavaScript

Автор

Виталий Котов

Метод matchAll() возвращает итератор результатов после сопоставления строки с регулярным выражением.

// объявление строки
const sentence = "JavaScript1JavaScript2";

// шаблон с «JavaScript», за которым следует цифра
const regex = /JavaScript\d/g;

// поиск совпадений в строке для заданного регулярного выражения
let results = sentence.matchAll(regex);

// цикл через итератор
for (result of results) {
  console.log(result);
}

// Вывод в консоль:
// ["JavaScript1", index: 0, input: "JavaScript1JavaScript2", groups: undefined]
// ["JavaScript2", index: 11, input: "JavaScript1JavaScript2", groups: undefined]

Синтаксис matchAll()

Синтаксис метода matchAll() следующий:

str.matchAll(regexp);

Где str - это строка.

Параметры matchAll()

Метод matchAll() принимает один параметр:

  • regex
    • объект регулярного выражения (Аргумент неявно преобразуется в regex, если он не является объектом regex)

Примечание:

  • Если объект regex не имеет флага /g, будет выдана ошибка TypeError.
  • Флаг g означает глобальный поиск, то есть этот флаг указывает на то, что мы проверяем регулярное выражение на все совпадения в строке.

Возвращаемое значение matchAll()

Возвращает итератор, содержащий совпадения, включая группы захвата.

Примечание: каждый элемент возвращаемого итератора будет иметь следующие дополнительные свойства:

  • groups
    • объект именованных групп захвата, ключами которых являются имена, а значениями - захваченные совпадения.
  • index
    • индекс поиска, в котором был найден результат.
  • input
    • копия строки поиска.

Примеры

Пример 1: Использование метода matchAll()

// объявление строки
const sentence = "I am learning JavaScript not Java.";

// шаблон, содержащий 'Java' с любым количеством символов от a до z
const regex = /Java[a-z]*/gi;

// поиск совпадений в строке для заданного регулярного выражения
let result = sentence.matchAll(regex);

// преобразование результата в массив
console.log(Array.from(result));

Вывод в консоль:

[
  'JavaScript',
  index: 14,
  input: 'I am learning JavaScript not Java.',
  groups: undefined
]
[
  'Java',
  index: 29,
  input: 'I am learning JavaScript not Java.',
  groups: undefined
]

В приведенном выше примере мы определили регулярное выражение regex с флагом /g. Затем мы вызвали метод matchAll() в sentence.

sentence.matchAll(regex) сопоставляет строку sentence с шаблоном, который содержит 'Java' вместе с любым количеством символов от a до z.

Метод нашел два соответствия - 'JavaScript' и 'Java' для заданного regex.

Примечание: результат метода matchAll() имеет вид объекта, поэтому мы использовали Array.from(result) для преобразования его в массив.

Пример 2: Регулярное выражение с учетом регистра в matchAll()

Регулярное выражение (regex) чувствительно к регистру. Мы можем использовать флаг i, чтобы сделать его нечувствительным к регистру в методе matchAll(). Например:

// объявление строки
const bio = "His name is  Albert and albert likes to code.";

// шаблон с надписью 'albert' или 'Albert'
const regex = /albert/gi;

// поиск 'albert' или 'Albert' в строке
const result = bio.matchAll(regex);

console.log(Array.from(result));

Вывод в консоль:

[
  [
    'Albert',
    index: 13,
    input: 'His name is  Albert and albert likes to code.',
    groups: undefined
  ],
  [
    'albert',
    index: 24,
    input: 'His name is  Albert and albert likes to code.',
    groups: undefined
  ]
]

Здесь мы использовали i в regex вместе с g (/albert/g), что делает его нечувствительным к регистру. Таким образом, метод возвращает массив с двумя итераторами с найденными соответствиями - 'Albert' и 'albert'.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile