为什么JavaScript';s RegExp在调用之间保持状态?
今天我遇到了一个非常奇怪的JavaScript正则表达式问题。使用全局修饰符(//g)时,RegExp.test()在后续调用中产生不同的值。有人能解释为什么吗为什么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)); //
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