正則g修飾符對test方法的影響
阿新 • • 發佈:2020-08-26
標籤: js
坑位
最近在使用正則的時候遇到一個問題,從一個數組中選出符合我要求的元素做進一步使用,但正則驗證莫名的失效不通過,坑位程式碼片段如下 測試地址 :
var reg = /\[.{32}\]/img; var list = [ '[c5b0fa7544d04e3ba2d22f608dc36497]', '[c5b0fa7544d04e3ba2d22f608dc36498]', '[c5b0fa7544d04e3ba2d22f608dc36499]', '[c5b0fa7544d04e3ba2d22f608dc36490]' ]; var resultList = list.filter(function(item) { return reg.test(item); }); console.log(resultList); // 輸出["[c5b0fa7544d04e3ba2d22f608dc36497]", "[c5b0fa7544d04e3ba2d22f608dc36499]"]
Why
當正則加了g修飾符後,執行一次正確匹配後,會記錄上一次匹配完的位置,屬性為lastIndex。
解決方案
- 方案1:每次都重寫一個正則,修改程式碼如下 測試地址:
var list = [ '[c5b0fa7544d04e3ba2d22f608dc36497]', '[c5b0fa7544d04e3ba2d22f608dc36498]', '[c5b0fa7544d04e3ba2d22f608dc36499]', '[c5b0fa7544d04e3ba2d22f608dc36490]' ]; var resultList = list.filter(function(item) { return /\[.{32}\]/img.test(item); }); console.log(resultList);
- 方案2: 每次開始匹配前先重置下lastIndex值,示例程式碼如下 測試地址:
var reg = /\[.{32}\]/img; var list = [ '[c5b0fa7544d04e3ba2d22f608dc36497]', '[c5b0fa7544d04e3ba2d22f608dc36498]', '[c5b0fa7544d04e3ba2d22f608dc36499]', '[c5b0fa7544d04e3ba2d22f608dc36490]' ]; var resultList = list.filter(function(item) { reg.lastIndex = 0; return reg.test(item); }); console.log(resultList);
- 方案3:對於這種test方法無需加上g修飾符,也就不會有上面說的問題了。