鍍金池/ 問答/Linux  HTML/ 正則匹配聲明位置 和 for循環(huán)問題

正則匹配聲明位置 和 for循環(huán)問題

崩潰的情況,
想測試下上傳文檔類型是否符合標準,然后就發(fā)現(xiàn)這樣的詭異事情。

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循環(huán)里面,就不會出錯了。。。。

誰能幫忙解釋下,為什么會出現(xiàn)這個錯誤,謝謝了。

回答
編輯回答
笨笨噠

全局匹配成功后 你正則的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循環(huán)是重置lastIndex

for (var i = 0; i < len; i++) {
    rex.lastIndex = 0; 
  var fileType = arr[i];
  if (!rex.test(fileType)) {   
    console.log("erro: " + i + "  " + fileType);
  }
}
2017年2月21日 07:34
編輯回答
蔚藍色

同一個正則共用一個指針

2018年2月16日 17:48