Согласно документации ,
JavaScript-объекты RegExp сохраняют состояние, если у них установлены глобальные или фиксированные флаги (например, /foo/g
или /foo/y
).Они хранят lastIndex
из предыдущего совпадения.
...
Если совпадение выполнено успешно, метод exec () возвращает массив и обновляет свойство lastIndex
регулярного выражения.объект.
Теперь представьте, что происходит на первой итерации.Регулярное выражение находит совпадение нулевой ширины в индексе 0, поэтому оно устанавливает lastIndex
в 0. Затем на второй итерации он начинает поиск с 0, где находит другое совпадение нулевой ширины, поэтому он устанавливает lastIndex
в 0снова.И цикл продолжается.
Поэтому вы должны поместить туда оператор if, чтобы проверить, соответствует ли совпадение нулевой ширине.Если это так, увеличьте последний индекс, чтобы он больше не совпадал.
function myFunction() {
var ptrn = new RegExp("u?", "gim");
var match;
var i = 0;
while ((match = ptrn.exec("color colour")) != null) {
console.log(JSON.stringify(match));
if (match.index == ptrn.lastIndex) {
ptrn.lastIndex++;
}
}
}
myFunction()