exec(): пошаговый поиск с состоянием lastIndex
Exec возвращает подробный результат очередного совпадения. При флаге g или y объект регулярного выражения хранит позицию продолжения в lastIndex, поэтому повторные вызовы связаны между собой.
Назначение
Exec возвращает подробный результат очередного совпадения. При флаге g или y объект регулярного выражения хранит позицию продолжения в lastIndex, поэтому повторные вызовы связаны между собой.
Как это работает
В примере g перебирает непустые числовые группы внутри короткой фиксированной строки. Цикл заканчивается, когда exec возвращает null. Исходный объект выражения создаётся один раз перед циклом.
Пример
const expression = /id=(\d+)/g;
const text = "id=7; id=18";
const ids = [];
let match;
while ((match = expression.exec(text)) !== null) {
ids.push(match[1]);
}
console.assert(ids.join(",") === "7,18");
console.assert(expression.lastIndex === 0);
console.log(ids);
Что должно получиться
В массив попадают две группы: 7 и 18. После неуспешного следующего поиска глобальное выражение сбрасывает lastIndex в ноль, что отдельно проверяется.
Граница применения и частая ошибка
Шаблон, способный совпасть с пустой строкой, может зациклить такой прямой цикл, если позиция не продвигается. Не создавайте новое глобальное выражение внутри условия каждой итерации. Для обычного перебора часто понятнее matchAll.
Самостоятельная проверка
Запишите lastIndex после каждого успешного поиска. Затем начните с ненулевой позиции и сравните результат. Не экспериментируйте с пустыми совпадениями в бесконечном цикле: ограничьте число шагов и изучите продвижение позиции отдельно.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.