2017-02-17 45 views
2

爲什麼第二次的console.log而第一個控制檯返回1第二個控制檯日誌如何返回空?

Code Source

var digit = /\d/g; 
 

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

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

返回null我不明白,如果我打開它,他們都返回1

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

我開始閱讀我上面提供的鏈接瞭解RegEx。執行官真的做了什麼?

+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"));

如果你運行上面,你會看到EXEC增加了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