为什么JavaScript RegEx在调用之间保持状态?

时间:2011-01-14 06:25:31

标签: javascript regex

今天我遇到了一个非常奇怪的JavaScript正则表达式问题。使用全局修饰符(// g)时,RegExp.test()会在后续调用中生成不同的值。任何人都可以解释原因吗?

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中重现这一点。

2 个答案:

答案 0 :(得分:9)

只有在使用g标志时才会这样。我同意这不是最好的设计,但重点是让你循环比赛,例如与re1.exec

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

答案 1 :(得分:2)

“如果您的正则表达式使用”g“标志,您可以多次使用exec方法在同一个字符串中查找连续匹配。当您这样做时,搜索从的子字符串开始s 由正则表达式的lastIndex属性指定(test也会提升lastIndex属性)。“

“与exec一样(或与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