正则匹配声明位置 和 for循环问题

崩溃的情况,
想测试下上传文档类型是否符合标准,然后就发现这样的诡异事情。

var rex = /docx|doc|xlsx|xls|pptx|ppt|txt|pdf|rar|zip|7z|cab|iso|html/ig;

var arr = ["doc", "docx", "docx", "docx", "doc", "doc", "doc", "doc", "doc", "doc", "doc"];
var len = arr.length;

for (var i = 0; i < len; i++) {
  var fileType = arr[i];      
  if (!rex.test(fileType)) {
    console.log("erro: " + i + "  " + fileType);
  }
}

// erro: 1  docx 
// erro: 3  docx
// erro: 5  doc
// erro: 7  doc
// erro: 9  doc

正确的答案,隔一个就错误,但是不符合正则的全都是错误。。。。

但是,把

var rex = /docx|doc|xlsx|xls|pptx|ppt|txt|pdf|rar|zip|7z|cab|iso|html/ig; 

放在for循环里面,就不会出错了。。。。

谁能帮忙解释下,为什么会出现这个错误,谢谢了。

阅读 2.4k
2 个回答

全局匹配成功后 你正则的lastIndex会改变,下一次匹配会从你匹配成功后的位置加1进行匹配,匹配失败后,lastIndex重置为0,又从第一位开始匹配
当你第一个匹配成功后rex的lastIndex会变成3,也就是匹配成功的doc的位置加上1,也就是3,下一次匹配从索引3开始,也就是docx的x,匹配失败,lastIndex重置为0,以此类推

for (var i = 0; i < len; i++) {
  var fileType = arr[i];
  if (!rex.test(fileType)) {   
    console.log("erro: " + i + "  " + fileType);
  }else{
    console.log(rex.lastIndex);      
   
  }
}

解决办法去掉/g或者for循环是重置lastIndex

for (var i = 0; i < len; i++) {
    rex.lastIndex = 0; 
  var fileType = arr[i];
  if (!rex.test(fileType)) {   
    console.log("erro: " + i + "  " + fileType);
  }
}

同一个正则共用一个指针

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题