2011-01-14 33 views
5

今天我遇到了一個非常奇怪的JavaScript正則表達式問題。當使用全局修飾符(// g)時,RegExp.test()在隨後的調用中產生不同的值。誰能解釋爲什麼?爲什麼JavaScript的RegExp在調用之間保持狀態?

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 

var re2 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/; 

console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 

我可以在Chrome 8和FireFox 3.6中重現這一點。

回答

7

只有當您使用g標誌時。我同意這不是最好的設計,但重點是讓你循環比賽,例如與re1.exec

var s = "fo1,fo2,fo3,"; 
var re1 = /fo\d,/g; 
var match; 
while(match = re1.exec(s)) 
{ 
    alert(match); 
} 
2

「如果你的正則表達式使用‘G’標誌,則可以使用exec方法多次找到連續比賽中相同的字符串。當你這樣做時,搜索在子字符串開始由正則表達式的lastIndex屬性指定的(測試也將推進lastIndex屬性)。「

「與exec(或與其組合)一樣,在同一全局正則表達式實例上多次調用的測試將超越前一個匹配。」

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
相關問題