2、正则的捕获是懒惰的
正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容
解决办法:添加全局修饰符g--->加上g后,第一次捕获完成后,lastIndex的值发生了改变,变为第一次捕获内容后的第一个字符的开始索引,第二次捕获是继续向后查找的...
疑问:不用全局修饰符g每次捕获完成后手动修改lastIndex的值不可以么?
不可以,虽然手动修改了lastIndex,确实把lastIndex的值进行改变了,但是正则查找的时候还是从索引0开始的
var str = "zhufeng2015peixun2016";
var reg = /\d+/g;
例子
为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g
RegExp.prototype.myExecAll = function myExecAll() {
var _this = this, str = arguments[0], ary = [], res = null;
!_this.global ? _this = eval(_this.toString() + "g") : null;
res = _this.exec(str);
while (res) {
ary[ary.length] = res[0];
res = _this.exec(str);
}
return ary;
};
var ary = reg.myExecAll(str);
console.log(ary);
console.log(reg.lastIndex);//->0
var res = reg.exec(str);
console.log(res);
console.log(reg.lastIndex);//->11
res = reg.exec(str);
console.log(res);
console.log(reg.lastIndex);//->21
res = reg.exec(str);
console.log(res);//->null