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

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

崩潰的情況,
想測(cè)試下上傳文檔類(lèi)型是否符合標(biāo)準(zhǔ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

正確的答案,隔一個(gè)就錯(cuò)誤,但是不符合正則的全都是錯(cuò)誤。。。。

但是,把

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

放在for循環(huán)里面,就不會(huì)出錯(cuò)了。。。。

誰(shuí)能幫忙解釋下,為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤,謝謝了。

回答
編輯回答
笨笨噠

全局匹配成功后 你正則的lastIndex會(huì)改變,下一次匹配會(huì)從你匹配成功后的位置加1進(jìn)行匹配,匹配失敗后,lastIndex重置為0,又從第一位開(kāi)始匹配
當(dāng)你第一個(gè)匹配成功后rex的lastIndex會(huì)變成3,也就是匹配成功的doc的位置加上1,也就是3,下一次匹配從索引3開(kāi)始,也就是docx的x,匹配失敗,lastIndex重置為0,以此類(lèi)推

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
編輯回答
蔚藍(lán)色

同一個(gè)正則共用一個(gè)指針

2018年2月16日 17:48