今天我遇到了一个非常奇怪的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中重现这一点。
答案 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