JS正则表达式问题

let regexStr = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;

let param = [
    "#ffbbad",
    "#Fc01DF",
    "#FFF",
    "#ffE"
]

let paramStr = "#ffbbad #Fc01DF #FFF #ffE";

for (let i = 0; i < param.length; i++) {
    console.log(param[i], regexStr.exec(param[i]));
}

console.log("paramStr", paramStr.match(regexStr));

这个正则表达式俩个结果输出的不一样

按照数组循环输出的结果为

#ffbbad true
#Fc01DF false
#FFF true
#ffE false

按照字符串的输出结果为

paramStr [ '#ffbbad', '#Fc01DF', '#FFF', '#ffE' ]

结果就是字符串全部匹配到了,但是数组的却俩个没有匹配到,这是什么原因呢?

阅读 2.2k
2 个回答
  1. 当你加了 g 标识之后,这个正则就是全局模式
  2. 全局模式下的正则表达式实例(万物皆对象,万物皆实例),会有 lastIndex 属性,记录上次匹配之后的位置
  3. 所以在遍历数组的时候,第一次匹配到,lastIndex 就会是字符长度也就是 7,那么之后的字符串都不超过 7 个字符,也就是 没有要匹配的内容,所以自然就匹配不到了
  4. 然后 lastIndex 被重置为 0,下一次就又匹配到了

参考阅读:MDN regexp.lastIndex

g标志会影响正则对象的lastIndex属性的值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题