Согласно прочитанной вами документации, lastIndex
начинается с 0 и изменяется на exec
до последнего индекса первого найденного соответствия после lastIndex
.
первый матч? Ну, это совпадение с нулевой шириной в начале строки. Это граница слова, не так ли? Это начало слова Hamilton
. Какой последний индекс этого матча? Все же 0
!
Так что lastIndex
не действительно изменилось. На следующей итерации l oop происходит то же самое. Такое же совпадение найдено, потому что lastIndex
по-прежнему равно 0. Сравните это с ситуацией, когда у вас есть совпадение не нулевой ширины, например \s
. В этом случае вторая итерация l oop фактически найдет второе совпадение, потому что lastIndex
равно увеличено на exec
.
Если вы посмотрите на код, который regex101.com
генерирует, в частности, есть механизмы, чтобы избежать этого бесконечного l oop:
const regex = /\b/gm;
const str = `Hamilton is a musical with music, lyrics Book `;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}