JavaScript高级程序设计(第3版)5.4 RegExp类型
例子里有个问题,
按照书中的内容,第一次打印出来的catastrophe应该只有一个true,其余9次为false,但是实际上打印出了10个true
var re = null,
i;
for(i=0;i<10;i++){
re =/cat/g;
console.log(re.test("catastrophe"));
}
for(i=0;i<10;i++){
re = new RegExp("cat","g");
// re.test("catastrophe")
console.log(re.test("catastrophe"));
}
你这个由于每次都生成新的正则,所以肯定都是true,第一个示例正则申明应该是放在for循环外吧,这样在外面全局匹配会从下次的位置开始查找,输出是true/false交替的,找不到后又从0位开始,又匹配了
没理由只有一个true,9次为false,肯定都为真,应该是书上讲解错误。
书上应该是说,
加了g的正则表达式在调用test()方法之后会更新正则对象的lastIndex属性(字符串匹配的结束位置)。
在对同一个正则对象第二次调用test()时会从正则对象的lastIndex的位置开始查找、而不是从头开始查找。
如果用test()没有匹配成功,正则对象的lastIndex属性会重置为0,下次调用test()时又会从头开始查找了。
你书上应该是忽略了这一点才会说只有一个true,其余9次为false。
要验证可以把re = new RegExp("cat","g");放在循环外,这样应该是5次true,5次false,交替出现。
(因为如果把re = new RegExp("cat","g");放在循环内,每次的正则对象都是重新创建的,lastIndex属性都是初始值:0)
另外,不加g的正则对象不会自动更新lastIndex属性。lastIndex属性始终是0
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632