说我有以下正则表达式代码:
var str = "{$ for ( var i = 0, len = O.length; i < len; i++ ) { $}";
var reg = /\{\$(.*?)\$\}/g;
console.log(reg.test(str));
console.log(reg.test(str));
console.log(reg.test(str));
为什么结果是True和False的交替?
答案 0 :(得分:3)
每docs:
当您想知道是否在字符串中找到模式时,请使用test方法(类似于String.search方法);有关更多信息(但执行速度较慢),请使用exec方法(类似于String.match方法)。与exec(或与其结合使用)一样,在同一个全局正则表达式实例上多次调用的测试将超过上一个匹配。
为了说明正在发生的事情,我们可以使用exec
并查看正在发生的事情。通过顺序:
null
(falsy)null
。为了证明,run the following:
var str = '{$ for ( var i = 0, len = O.length; i < len; i++ ) { $}';
var reg = /\{\$(.*?)\$\}/g;
for (var i = 0; i < 3; i++){
var result = reg.exec(str);
console.log(result);
console.log(!!result);
}
答案 1 :(得分:2)
内部JavaScript RegExp
s maintain state,包括匹配的最后一个索引等字段。因此,您可以在重用正则表达式时看到一些有趣的行为,如您给出的示例所示。
/g
标志会导致它针对给定字符串的每次连续匹配返回true
一次(在您的示例中恰好只有一个),之后它将返回{{ 1}}一次,然后重新开始。在每次调用之间,上述false
属性将相应更新。
请考虑以下事项:
lastIndex
对战:
var str = "12";
var regex = /\d/g;
console.log(regex.test(str)); // true
console.log(regex.test(str)); // true
console.log(regex.test(str)); // false
答案 2 :(得分:0)
有趣的发现!我相信它与你的全局修饰符'/ g'有关。当您删除全局修饰符时,它似乎按预期工作。我不是正则表达专家;我只能假设.test()可以迭代$符号,即使它不应该匹配两次。