2015-10-03 2 views
-1

Я играл вокруг с регулярными выражениями в JS в первый раз, и я пытался в течение долгого времени, чтобы сделать что-то подобное с регулярным выражением буквально, страница не будет загружаться и в конечном счете крах:Нельзя использовать литерал регулярного выражения для regex.exec()?

var string = "12453828378123898728912382123833"; 
var match; 
while(match = /123(\d)/g.exec(string)) { 
    console.log(match[1]); 
} 

Однако , если я ставлю буквальным в переменную, то он работал просто отлично:

var string = "12453828378123898728912382123833"; 
var match; 
var regex = /123(\d)/g; 
while(match = regex.exec(string)) { 
    console.log(match[1]); 
} 

Выход:

8 
8 
8 

Почему это происходит? Я немного новичок JS, и мне действительно не нужно это знать, но мне любопытно.

+0

возможно дубликат [В чем разница между Exec РегВыра() функцией и соответствием строки (в) функциях?] (Http://stackoverflow.com/questions/9214754/what-is-the-difference-between -regexp-s-exec-function-and-string-s-match-fun) – Anonymous

+0

Я угадываю каждую оценку литералов как новый объект regexp, и сам объект хранит историю для этого цикла, поэтому используя один кешированный объект поддерживает историю, используя литерал на месте - это как начинать с нуля каждый раз. – ShadowRanger

+2

@ Не знаю, почему это дубликат? Это не связано с функцией match(). У этого есть литералы, но его ответы действительно не объясняют, почему литералы не могут быть использованы. –

ответ

2

Это происходит из-за промежуточных данных, хранящихся в объекте регулярного выражения.

Если вы используете литерал регулярного выражения, то он будет создавать новый объект на каждой итерации. Это означает, что он найдет первый матч снова и снова и никогда не закончит цикл.

2

В вашем первом случае он сработает, потому что он просто продолжает вращаться, поскольку regex воссоздается, что сбрасывает его внутреннее состояние с флагом g. Это никогда не может закончиться.

Во втором случае это один и тот же объект регулярного выражения с каждым поворотом петли.

1

Подтверждено: Использование регулярных выражений буквального или RegExp конструктор в сам условно вызывает проблему:

Примечание: Не помещайте регулярное выражение буквальным (или RegExp конструктор) в пределах состояния во время или он будет создать бесконечный цикл, если есть совпадение из-за того, что свойство lastIndex сбрасывается на каждой итерации. Также убедитесь, что глобальный флаг установлен или здесь также будет цикл. Source: Mozilla Developer Center

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

  • Нет связанных вопросов^_^