首页 > 技术文章 > 正则g修饰符对test方法的影响

xwwin 2020-08-26 13:03 原文

标签: 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修饰符,也就不会有上面说的问题了。

推荐阅读