JS正则表达式的懒惰性

let str = 'zhongguo2020qiangda2021fuyu2022';
/*
*  reg.lastIndex: 当前正则下一次匹配的起始索引位置
*  懒惰性捕获的原因:默认情况下lastIndex的值不会被修改,每一次都是从字符串
*  开始位置查找,所以找到的永远是第一个
*  解决办法:全局修饰符g
*/
let reg = /\d+/;
console.log(reg.lastIndex);  // 0  下面匹配捕获是从str索引0的位置开始找
console.log(reg.exec(str));  
console.log(reg.lastIndex);  // 0  下第一次匹配捕获完成,lastIndex没有改变,所以下一次exec依然是从字符串最开始找,找到的永远是第一个匹配到的。

let reg = /\d+/g;
console.log(reg.exec(str));   // ['2020'...]
console.log(reg.lastIndex);  // 12  设置全局匹配修饰符g后,第一次匹配完,lastIndex会自己修改
console.log(reg.exec(str));   // ['2021'...]
console.log(reg.lastIndex);  // 19
console.log(reg.exec(str));   // ['2022'...]
console.log(reg.lastIndex);  // 27
console.log(reg.exec(str));   // null  当全部捕获后,再次捕获的结果是null,但是lastIndex又回归了初始值0
console.log(reg.lastIndex);  // 0
console.log(reg.exec(str));   // ['2020'...]

// 字符串中的match方法,可以在执行一次的情况下,捕获到所有匹配的数据(前提:正则也得设置g才可以);
let reg = /\d+/g;
console.log('2020niuhao2021nihao2022nihao'); // [2020, 2021, 2022]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容