2015-08-12 3 views
2

У меня есть следующий блок кода:Почему этот процесс RegExp вызывает бесконечный цикл?

var field, 
    reg = new RegExp('{{.*?}}', 'i'), 
    text = 'This is a string with 1: {{param1}}, 2: {{param2}} and 3: {{param3}} parameters.'; 

while (field = reg.exec(text)) { 
    console.log(field); 
} 

Если я включаю g глобальный флаг, цикл работает нормально. Но если это не глобально, то reg.exec(text); должен вернуть null после первого совпадения и завершить цикл while?

Попытка понять причину этого, если кто-то может разработать, я бы очень признателен.

+0

Что произойдет, если вы избежите '{' и '}'? – npinti

+0

Почему вы не захватываете шаблон ('()')? – Xlander

+0

@npinti, я боюсь. – keldar

ответ

9

Документация MDN для RegExp.prototype.exec() имеет то, что я думаю, что это ответ, объясняя значение lastIndex свойства объекта RegExp:

Индекс, на котором, чтобы начать следующий матч. Когда «г» отсутствует, это останется 0.

Таким образом, каждый раз, когда вы звоните .exec() на этом RegExp объект, он будет начинать с начала строки снова. Если есть хотя бы одно совпадение, это означает, что он всегда найдет совпадение, и ваш цикл никогда не закончится.

+0

Хорошо заметили, ха! Спасибо. – keldar

3

Его так как RegExp.prototype.exec в сочетании с флагом g фактически мутирует начальный индекс самого экземпляра RegExp.

С другой стороны, без знака g он не мутирует, поэтому он всегда возвращает первый результат, если он соответствует вашему циклу while, будет идти горилла.

Смежные вопросы