今天我遇到了一个非常奇怪的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中重现这一点.
只有当你使用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”标志,则可以多次使用 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)