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

J.P*_*.P. 6 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
Run Code Online (Sandbox Code Playgroud)

我可以在Chrome 8和FireFox 3.6中重现这一点.

Mat*_*hen 9

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

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


G.G*_*.G. 5

“如果您的正则表达式使用“g”标志,则可以多次使用 exec 方法来查找同一字符串中的连续匹配项。这样做时,搜索将从正则表达式的 lastIndex 属性指定的s的子字符串开始(测试还将推进 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
Run Code Online (Sandbox Code Playgroud)