2017-02-17 4 views
2

Я не понимаю, почему второй console.log возвращает null в то время как первая консоль возвращает 1Как второй журнал консоли возвращает null?

Code Source

var digit = /\d/g; 
 

 
console.log(digit.exec("here it is: 1")); 
 

 
console.log(digit.exec("and now: 1"));

Если переведем они оба возвращается 1

var digit = /\d/g; 
 
console.log(digit.exec("and now: 1")); 
 
console.log(digit.exec("here it is: 1"));

Я начинаю изучать RegEx читая ссылку я предоставил выше.

Что делает exec действительно?

+1

читать [документацию] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec) для почему это происходит –

+0

Близко связанные: [Почему RegExp с глобальным флагом в Javascript дает неправильные результаты?] (https://stackoverflow.com/questions/1520800/why -regexp-with-global-flag-in-javascript-give-wrong-results) – apsillers

ответ

6

var digit = /\d/g; 
 

 
console.log(digit.exec("here it is: 1")); 
 
console.log(digit.lastIndex); 
 

 
console.log(digit.exec("and now: 1")); 
 

 
var digit2 = /\d/g; 
 

 
console.log(digit2.exec("and now: 1")); 
 
console.log(digit2.lastIndex); 
 
console.log(digit2.exec("here it is: 1"));

Если вы запустите выше, вы увидите, что ехес добавляет lastindex свойства в регулярные выражения и использует в качестве исходного показателя для следующего поиска. Когда это более короткая строка сначала (с точки зрения нахождения первой цифры), тогда она находит цифру в обоих exec. Когда более длинная строка является первой, lastIndex фактически проходит цифру во второй (более короткой) строке и поэтому возвращает null.

Это происходит, только если вы используете флаг// g. Без g он будет работать, как вы ожидаете, поскольку lastIndex сбрасывается на 0 для каждого exec:

var digit = /\d/; 
 

 
console.log(digit.exec("here it is: 1")); 
 
console.log(digit.lastIndex); 
 
console.log(digit.exec("and now: 1"));

+0

Если я правильно его понимаю, то индекс формы первой консоли будет использоваться во втором соглашении единственный?. Например, индекс первой консоли равен 13, а второй индекс консоли - 10, поэтому он не найдет его, поэтому результат равен нулю. Поправьте меня если я ошибаюсь. – KiRa

+0

Да, вы правы. 'lastIndex' обеспечивает отправную точку для следующего поиска. Таким образом, второй 'exec' будет игнорировать первые 10 символов, например. С глобальными настройками ожидается, что вы повторите поиск в той же строке, пока не получите их все. В этом случае вы переключаете строки, но 'lastIndex' все еще вступает в силу. – rasmeister

+0

спасибо. Я получаю это сейчас. Спасибо за объяснение. – KiRa

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