为什么JavaScript';s RegExp在调用之间保持状态?

为什么JavaScript';s RegExp在调用之间保持状态?,javascript,regex,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)); //

今天我遇到了一个非常奇怪的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

我能够在Chrome8和Firefox3.6中重现这一点

仅当您使用
g
标志时。我同意这不是最好的设计,但重点是让您循环匹配,例如使用
re1.exec

var s = "fo1,fo2,fo3,"; 
var re1 = /fo\d,/g;
var match;
while(match = re1.exec(s)) 
{ 
  alert(match); 
}
如果正则表达式使用“g”标志,则可以多次使用exec方法查找同一字符串中的连续匹配项。执行此操作时,搜索将从正则表达式的lastIndex属性指定的s子字符串开始(测试也将推进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