2015-04-12 2 views
3

Следующая example немного запутанным для меня:Eloquent Javascript Looping над RegExp Матчи

var text = "A string with 3 numbers in it ... 42 and 88."; 
var number = /\b(\d+)\b/g; 
var match; 
while (match = number.exec(text)){ 
    console.log("Found", match[1], "at", match.index); 
} 

В частности, я не понимаю, как это имеет «зацикливание» эффект. Как он проходит через все совпадения внутри одной строки, если он продолжает звонить match[1]. Есть ли какой-то побочный эффект с exec, о котором я не знаю?

Edit: Я все еще хотел бы получить ответ на то, как match[1] работает. Как match[1] ответить на любой вопрос? Когда я проверить этот тип вещи сам, я получаю undefined, посмотрите

> var y = /\d+/g.exec('5') 
undefined 
> y 
[ '5', index: 0, input: '5' ] 
> y[1] 
undefined 

Что здесь происходит? Разве это не будет y [0], или в приведенном выше случае, совпадение [0]? Как:

> y[0] 
'5' 

ответ

5

RegExp объект запоминает последнюю согласованную позицию lastIndex собственности.

Цитирование MDN Documentation,

Если регулярное выражение использует флаг "g", вы можете использовать exec() метод несколько раз, чтобы найти последовательные матчи в одной и той же строке. Когда вы это сделаете, поиск начинается с подстроки str, указанной регулярным выражением lastIndex. (test() также будет продвигать свойство lastIndex).

Важное примечание: Первая часть первой строки процитированного раздела имеет важное значение. If your regular expression uses the "g" flag. Только если у RegEx есть флаг g, вы получите это поведение.

+1

Добавляем к этому, когда вы добавляете это '/ g' в регулярное выражение, которое вы явно задаете для этого поведения. Если вы удалите '/ g', поведение, которое вы обнаружите, неожиданно исчезло. –

+0

@BenjaminGruenbaum Я оставил записку об этом. Спасибо :-) – thefourtheye

+0

@thefourtheye Хорошо, я могу это понять. Но вы действительно не ответили на мой вопрос о 'match [1]'. Почему это не 'матч [0]' .Пожалуйста, отредактируйте мой отредактированный пост. – ApathyBear