Как matchAll совпадает с сопоставлением и контрастом

Пока я отдыхаю от своей серии регулярных выражений, я хотел написать статью, которая все еще была связана с регулярными выражениями. Недавно я узнал о .matchAll() Метод, которым я не пользовался до прошлой недели.

В этой статье я упоминал, как сопоставить шаблон и извлечь его в массив с помощью метода .match(). Вы увидите, что .matchAll() работает аналогично .match() с небольшими отличиями.

.соответствие()

.match() метод принимает один аргумент: RegExp.

Вы будете использовать .match() как свойство тестируемого строкового значения, а внутри скобок вы поместите свой шаблон RegExp. Возвращаемое значение будет массивом всех совпадений или пустым массивом. Возвращаемый массив будет зависеть от флага g (или глобального), который возвращает все вхождения шаблона, который вы хотите сопоставить.

Как видите, он возвращает массив, и первым индексом является совпадающая гласная. Интересно, что следующие индексы в этом массиве читаются как объект. Второй индекс содержит свойство index, а значение - это индекс места совпадения внутри строки. Затем свойство input содержит значение, которое является исходной строкой, и свойство groups, которое относится к группам захвата. Он соответствует только первому вхождению, потому что мы не использовали глобальный флаг.

С мировым флагом

Он возвращает массив, в котором все гласные в строке сопоставляются с массивом.

.matchAll ()

С .matchAll() он не создает единый массив со всеми извлеченными совпадениями, а создает итератор. Требуется один аргумент: RegExp.

Согласно веб-документации MDN, RegExp должен иметь флаг /g. В противном случае будет выброшено TypeError.

Чтобы лучше понять метод .matchAll(), давайте попробуем его использовать.

Я вставлю в консоль наш пример выше, но с .matchAll() в переменной vowelsInString:

Когда мы проверяем переменнуюvowelsInString, мы получаем RegExpStringIterator.

Что это обозначает?

Чтобы увидеть итератор, мы можем либо просмотреть его, либо использовать метод .next(). Я покажу вам оба пути.

Если мы используем .next():

Мы получаем первое совпадение, и оно представляет собой объект с двумя парами "ключ-значение" . Он имеет ключ value, который имеет массив в качестве значения, и ключ done со значением false.

Внутри массива в ключе value у нас есть фактическое совпадение и вся его информация. Первый индекс - это гласная, которую мы искали в нашем регулярном выражении. Следующий индекс в этом массиве читается как объект. Он содержит значение индекса совпадения в исходной строке. Далее идет свойство input со значением самой входной строки. И, наконец, последний индекс - это свойство groups, которое проверяет, были ли группы захвата в нашем регулярном выражении.

Второй done ключ объекта означает, что для этого регулярного выражения есть дополнительные совпадения. Другими словами, этот итератор еще не закончил. Когда мы дойдем до конца, он изменится на true. Продолжим нашу итерацию:

Вот как будет выглядеть финальный вариант:

Как видите, наш value не определен, а свойство done теперь true.

Сейчас я покажу вам, как это работает с циклом for…of:

Чтобы преобразовать это в один полный массив, MDN советует использовать оператор spread. Для этого все, что нам нужно сделать, это написать:

let allMatches = […vowelsInString]

Теперь есть массив массивов, в котором хранятся все совпадения и соответствующая информация.

Заключение

Я надеюсь, что это был полезный урок по использованию .matchAll() и .match(). Если вам все еще интересны оба метода, я предлагаю прочитать документацию MDN: