循环时正则匹配的坑!正则的lastIndex属性

循环时进行正则校验

今天在使用正则进行校验的时候遇见了一个很是神奇的问题!经过一段实验感觉更是惊奇,于是在网上寻求帮助之后才发现了原因所在!

let reg = /\.jpg/g;
let arr = [
    'pic1.jpg',
    'pic2.jpg',
    'pic3.jpg',
    'pic4.jpg',
    'pic5.jpg',
];
arr.forEach( item => {
  console.log(reg.test(item))
});

执行如上的代码,结果会是怎么样?
循环时正则匹配的坑!正则的lastIndex属性_第1张图片
看到结果有些人应该会很吃惊,不应该都为true?
敲黑板了!干货来了!

正则中有一个lastIndex的属性,一般情况下是不会发现它的!
但是,在正则表达式使用了表示全局检索的 “g” 标志时,该属性就会发挥它的作用了!在使用regexp.test 和 regexp.exec这两个方法时,你可能会发现结果不是你想要的!

#规则如下

1.初始状态lastIndex为0

2.在进行匹配校验的过程中,若成功匹配,那么lastIndex就会等于符合规则的字符串的最后一个下标再+1

3.匹配失败,lastIndex会置为0

4.如果继续用这个正则去匹配的话,就会从这个lastIndex开始

测试结果如下
循环时正则匹配的坑!正则的lastIndex属性_第2张图片

解决方式有三种

不加全局匹配 g

循环时正则匹配的坑!正则的lastIndex属性_第3张图片

不要把正则作为一个变量,每次都是用正则表达式去匹配

循环时正则匹配的坑!正则的lastIndex属性_第4张图片

在每次执行之后把lastIndex置为0

循环时正则匹配的坑!正则的lastIndex属性_第5张图片
结语:基础知识还是相当重要的,书中自有颜如玉!

你可能感兴趣的:(JavaScript)