2012-04-19 31 views
5

可能重複時:所有的
Javascript regex returning true.. then false.. then true.. etc錯誤與正則表達式在JavaScript中做全局搜索

首先,我的英文不好道歉。

我想測試字符串匹配的模式,所以我已經寫了這個:

var str = 'test'; 
var pattern = new RegExp('te', 'gi'); // yes, I know that simple 'i' will be good for this 

但是我有這個意想不到的結果:

>>> pattern.test(str) 
true 
>>> pattern.test(str) 
false 
>>> pattern.test(str) 
true 

誰能解釋一下嗎?

回答

10

此行爲的原因是RegEx不是無狀態的。您的第二個test將繼續查找字符串中的下一個匹配項,並報告它找不到。進一步搜索從頭開始,當沒有找到匹配lastIndex復位:

var pattern = /te/gi; 

pattern.test('test'); 
>> true 
pattern.lastIndex; 
>> 2 

pattern.test('test'); 
>> false 
pattern.lastIndex; 
>> 0 

你會發現這是如何發生變化的時候有兩場比賽,例如:

var pattern = /t/gi; 

pattern.test('test'); 
>> true 
pattern.lastIndex; 
>> 1 

pattern.test('test'); 
>> true 
pattern.lastIndex; 
>> 4 

pattern.test('test'); 
>> false 
pattern.lastIndex; 
>> 0 
2

我想你遇到了這樣的問題:https://bugzilla.mozilla.org/show_bug.cgi?id=237111

卸下g參數解決了這個問題。基本上,它是由於lastindex財產每一次,記得最後一個值,你執行test()方法

+0

Thanx for answer! 是的,我現在刪除'g'解決了這個問題。但這個錯誤也出現在Chrome ... – 2012-04-19 13:34:00

+0

這不是一個錯誤。 'test'和'exec'被設計來做到這一點。現在讓我去找這個笨蛋... – zzzzBov 2012-04-19 13:34:09

+0

我不會說這是一個錯誤。這是如何實現正則表達式的。事實上,這是OP – fcalderan 2012-04-19 13:34:45

1

引述MDN Docs(重點煤礦):

當你想知道的模式是否在列使用發現測試方法(類似於String.search方法);有關更多信息(但執行較慢),請使用exec方法(與String.match方法類似)。與exec(或與其組合)一樣,在同一個全局正則表達式實例上多次調用的測試將超過先前的匹配。

0

這是預期的行爲RegExp.test(str) method。正則表達式實例(模式)存儲可以在lastIndex屬性中看到的狀態;每次你打電話「測試」它更新該值,並跟隨調用相同的參數可能會產生或不會產生相同的結果:

var str="test", pattern=new RegExp("te", "gi"); 
pattern.lastIndex; // => 0, since it hasn't found any matches yet. 
pattern.test(str); // => true, since it matches at position "0". 
pattern.lastIndex; // => 2, since the last match ended at position "1". 
pattern.test(str); // => false, since there is no match after position "2".