正则匹配中‘神奇’的lastIndex

在JavaScript中,正则表达式匹配时,全局标志`g`会涉及一个特殊属性`lastIndex`。该属性在匹配成功后会被更新为下次匹配的起始位置,导致连续匹配时的意外行为。当匹配失败,`lastIndex`重置为0。理解这一特性对于正确使用`test`和`exec`方法至关重要,避免不必要的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近新写的需求有这么一个小功能,对列表的数据进行过滤(支持多个词,相信大家都会想到使用正则匹配来做
在这里插入图片描述
代码如下:

let data = [
  { title: 'Sponsored Amazon' },
  { title: 'Bounty' },
  { title: 'Paperless Kitchen Dish Cloths' },
  { title: 'Centerpull' },
  { title: 'Premium Quality Fits Bounty' },
  { title: 'Shop Glad' },
  { title: 'previously branded Preference' },
  { title: 'Pacific Blue Select' },
  { title: 'Glad paper plates' },
  { title: 'Reusable' }
]
let includesTitle = ['Sponsored', 'Amazon', 'Bounty', 'Reusable']
const a = includesTitle.join('|')
const reg = new RegExp(`(${a})`, 'gi')

function filter(data) {
  return data.reduce((pre, cur) => {
    if (reg.test(cur.title)) {
      pre.push(cur.title)
    }
    return pre
  }, [])
}
console.log(filter(data))

理想输出:
在这里插入图片描述

实际输出:
在这里插入图片描述
查阅资料后发现,原来正则中还有这么一个属性lastIndex,它的值是正则下一次匹配时的起始位置
参考链接:循环下的正则匹配?说说正则中的lastIndex

在正则中包含全局标志g时,正则的test和exec方法就会使用到这个属性,具体规则如下:

初始状态下lastIndex的值为0
若成功匹配,lastIndex的值就被更新成被匹配字符串后面的第一个字符的index,或者可理解为被匹配字符串的最后一个字符index + 1
若匹配失败,lastIndex则被重置为0
如果继续使用原先的正则进行下一轮匹配,则会从字符串lastIndex的位置开始进行

将代码中的全局匹配g删掉,得到了理想的输出
在此对‘神奇’的正则匹配中的lastIndex做个浅浅的记录,大家在使用正则的testexec方法,谨慎使用全局标志g,避免bug的出现噢~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值