1. 程式人生 > 實用技巧 >正則g修飾符對test方法的影響

正則g修飾符對test方法的影響

標籤: 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修飾符,也就不會有上面說的問題了。