JavaScript | Как получить индексы повторяющихся последовательностей в строке?

Есть строка:

var stroka = "osab-kr-abmd-eqabt-ldab"

Мы хотим узнать под какими индексами в этой строке начинаются последовательности символов «ab». Как это сделать?

В решении задачи нам поможет такое понятие как Итератор Регулярных Выражений по Строке — RegExpStringIterator {}

Он имеет единственный метод next(), который вызывается в момент сопоставления строки по шаблону регулярного выражения. Итератор нужно преобразовать в массив. Каждый успешный результат сопоставления будет возвращать отдельные массивы, у которых будет указан индекс найденного положения сопоставления последовательности символов.

Для получения итератора используется метод matchAll(). Возможны два сценария вызова метода matchAll().

Решение № 1 — Через строковый метод matchAll ( regexp )

Есть строка:

var stroka = "osab-kr-abmd-eqabt-ldab"
[...stroka.matchAll(/ab/g)]

Получаем массив из массивов:

Через строковый метод matchAll(regexp) - JavaScript
Через строковый метод matchAll(regexp) — JavaScript

Теперь мы можем пробежать по новому массиву и получить только числовые индексы позиций начала появления последовательностей в строке

[...stroka.matchAll(/ab/g)].map(i=>i.index)

Нам вернётся

[2, 8, 15, 21]
Получили индексы повторяющихся последовательностей символов в строке - JavaScript
Получили индексы повторяющихся последовательностей символов в строке — JavaScript

Решение № 2 — Через метод регулярных выражений [ @@matchAll ] ( string )

Есть строка:

var stroka = "osab-kr-abmd-eqabt-ldab"
[.../ab/g[Symbol.matchAll](stroka)]

Получаем массив из массивов:

[.../ab/g[Symbol.matchAll](stroka)].map(i=>i.index)
Через метод регулярных выражений [@@matchAll](string) - JavaScript
Через метод регулярных выражений [@@matchAll](string) — JavaScript

Информационные ссылки

Стандарт ECMAScript — Раздел «22.1.3.12 String.prototype.matchAll ( regexp )» — https://tc39.es/ecma262/#sec-string.prototype.matchall

Стандарт ECMAScript — Раздел «22.2.5.8 RegExp.prototype [ @@matchAll ] ( string )» — https://tc39.es/ecma262/#sec-regexp-prototype-matchall

Поделись записью