2010-11-17 49 views
1

我在VS2005中開發,並在我的頁面中有一些JS代碼。在我遇到問題的特定循環中,我設置了一個斷點。這是我與IDE的小談話 -不尋常的JavaScript正則表達式結果,請解釋!

? ind 
/d/g 
? ind.test("d") 
true 
? ind.test("dtn") 
false 
? ind.test("dtn") 
true 
? ind.test("dtn") 
false 
? ind.test("dtn") 
true 
? ind.test("dtn") 
false 

爲什麼測試在真假之間交替? ind是我的正則表達式 - 我把它像這樣:

case "datetime" : ind = new RegExp("d","g");break; 

UPDATE

所以我改變我的聲明解決了我的問題

ind = /d/; 

即省略了全球改性劑。我想

ind = RegExp("d"); 

會同樣工作。

雖然這個問題仍然存在。爲什麼全局修飾符會導致test在true和false之間切換?

回答

5

與EXEC(或與 其組合),測試呼籲 相同的全局正則表達式 例如多次將推動過去 以前的比賽。

來源:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test

那麼究竟發生在這裏是因爲你使用正則表達式的全局選項,它會繼續搜索的字符串後,找到了一個匹配。

ind.test("d") 

這將在位置0找到d。

ind.test("d") 

這將立即搜索d開始位置1,但因爲這是字符串的結束也不會發現什麼因此返回

我們可以使用正則表達式的lastIndex財產證明:

ind.lastIndex 
>> 0 
ind.test("d") 
>> true 
ind.lastIndex 
>> 1 
ind.test("d") 
>> false 
+1

+1我只是寫這個時,我發現別人已經回答:) – 2010-11-17 09:46:18

3

調用re.test(str)相當於re.exec(str) != null(見specification of RegExp.prototype.test(string))。

而且隨着克對正則表達式調用exec修改多次,搜索是不是在開頭的字符串,但在以前的搜索結束在那裏的位置開始(lastIndex,與0初始化):

如果您的正則表達式使用「g」標誌,則可以多次使用exec方法在同一個字符串中查找連續的匹配項。當您這樣做時,搜索開始於由正則表達式的lastIndex屬性指定的子字符串strtest也將提前lastIndex屬性)。

這就是爲什麼你會得到這個奇怪的結果。