2011-01-14 78 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 
相关问题