当前位置: 首页 > news >正文

正则表达式(/g修饰符)踩坑

在书写正则表达式时,有一个常用的符号'/g'代表在该字符串中进行全局搜索,常用方法test()或在String.replace()中做匹配替换文本, 非常的方便

const regExp = /ab/g;

在某种需求下,我对这个正则调用了两次

console.log(regExp.test('abc'));
console.log(regExp.test('abc'));

结果会是什么,两次true?刚开始我也是这么认为的,执行一下

// 得到了
true
false

为什么会出现此错误,根据mdn文档中对正则表达式的lastIndex属性的描述

只有正则表达式使用了表示全局检索的 "g" 或者粘性检索的 "y" 标志时,该属性才会起作用。此时应用下面的规则:

  • 如果 lastIndex 大于字符串的长度,则 regexp.test 和 regexp.exec 将会匹配失败,然后 lastIndex 被设置为 0。
  • 如果 lastIndex 等于或小于字符串的长度,则该正则表达式匹配从 lastIndex 位置开始的字符串。
    • 如果 regexp.test 和 regexp.exec 匹配成功,lastIndex 会被设置为紧随最近一次成功匹配的下一个位置。
    • 如果 regexp.test 和 regexp.exec 匹配失败,lastIndex 会被设置为 0

由这句话

如果 regexp.test 和 regexp.exec 匹配成功,lastIndex 会被设置为紧随最近一次成功匹配的下一个位置。

可以得到,在第一次调用结束并匹配成功后,下标(lastIndex)并不会回到0,测试一下

true
2
false

可以看到,在第一次调用test()后,lastIndex停在了2这个位置,也就是下一次调用test()时,lastIndex将从2开始, 所以第二次调用test()时会得到false,如果想要返回结果都是true,那么可以手动将lastIndex重置为0

if (regExp.lastIndex) {regExp.lastIndex = 0;
}

再次执行后,查看执行结果

true
0
true

由此可见,下标又回到了0,第二次调用test()则匹配成功

如果想不用多次调用时都要重置为0的情况下,可以不使用/g或/y符号,也可以将表达式放在函数内, 使函数每次调用时都是重新定义正则表达式, 也就不存在下标还是上一次调用的情况

http://www.dtcms.com/a/614582.html

相关文章:

  • 某空气质量检测平台的爬虫——mitmproxy的简单使用
  • 我市精神文明建设的门户网站小程序有哪些
  • 【开题答辩全过程】以 二手书平台管理系统的设计与实现为例,包含答辩的问题和答案
  • 深入解析:使用 Triton 实现 Flash Attention2 - 让大模型训练飞起来
  • 国内最大的自建站平台设计网站推荐国内
  • 网站用户访问统计软件开发工程师证书有用吗
  • 【对比】Pandas vs Polars:下一代DataFrame库的崛起
  • 阅读:基于深度学习的红外可见光图像融合综述
  • 网站开发北京网站已备案 还不能访问
  • visual stdio 做网站 注册用户 密码必须6位以上莱芜车管所网站
  • 本科[Python方向]毕业设计选题指南
  • 2017二级C语言编译环境配置与使用技巧 | 掌握编译环境,提高编程效率
  • 蓝牙SIG命令初始化流程
  • 网站建设济南网页建设培训机构
  • 【LeetCode】115. 不同的子序列
  • JavaScript实现一个复制函数,兼容旧浏览器
  • 网站开发人员岗位要求wordpress主题安装报错
  • 第38节:WebGL 2.0与Three.js新特性
  • 前端性能监控新方案
  • 网站建设岗位能力评估表深圳网警
  • LlamaIndex PromptTemplate 全面解析
  • 邯郸网站建设优化排名无锡网站推广¥做下拉去118cr
  • 高级语言编译程序 | 深入探讨编译原理及应用领域
  • 网站建设公司杭州18年咸鱼app引导页面设计模板
  • 2025年开源项目
  • 工控人如何做自己的网站怎么利用网站开发app
  • 温振传感器振动信号采集器 机泵状态实时监测 报警数据自动采集模块
  • 襄阳营销网站建设做一个公司网站
  • Vue3计算属性如何兼顾模板简化、性能优化与响应式自动更新?
  • 换友情链接的网站门户网站开发建设成本明细