iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js循环中使用正则失效异常的踩坑实战
  • 300
分享到

js循环中使用正则失效异常的踩坑实战

摘要

目录1、异常案例:2、原因分析3、解决方法13、解决方法23、解决方法3总结1、异常案例: 使用正则匹配111 const regular = /111/g; // 匹配111

1、异常案例:

使用正则匹配111

const regular = /111/g; // 匹配111
    // console.log(regular.test('111')); // true 匹配成功
    // console.log(regular.test('111,111')); // true 匹配成功

    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        // 异常写法
        console.log('log_________' + regular.test(element));
    });  
    // 打印结果 
    // log_________true
    // log_________false // 会存在正则匹配为false的异常
    // log_________true
    // log_________true

why? 首先去MDN看了看正则的基础概念。

发现了lastIndex 这个属性。

2、原因分析

    用正则表达式只要设置了全局匹配标志 /g ,test()方法 的执行就会改变正则表达式 lastIndex 属性。再循环中连续的执行 test() 方法,后面的执行将会从 lastIndex 数字处开始匹配字符串

原来如此,看来test() 方法确实也不能随便滥用。

确认验证一下:

const regular = /111/g; // 匹配111

    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        // 异常写法
        console.log('log_________' + regular.test(element));
        // 打印lastIndex
        console.info('logLastIndex___' + regular.lastIndex); 
    });  
    // 打印结果 
    // log_________true
    // logLastIndex___3
    // log_________false  // 确实因为lastIndex为3导致的
    // logLastIndex___0
    // log_________true
    // logLastIndex___3
    // log_________true
    // logLastIndex___7

3、解决方法1

上面我们发现正则test()方法有lastIndex属性,每次循环给恢复一下。

const regular = /111/g; // 匹配111
    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        regular.lastIndex = 0;
        console.log('log_________' + regular.test(element)); // 打印正常
    });

问题解决 OK了。

3、解决方法2

上面我们发现正则表达式设置了全局标志 /g 的问题,去掉/g全局匹配。(这个具体还得看自己的应用场景是否需要/g)

const regular = /111/; // 去掉/g全局匹配
    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        console.log('log_________' + regular.test(element)); // 打印正常
    });

OK了。

3、解决方法3

js有基本数据类型和引用数据类型

ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。\

基本数据类型:Number、String、Boolen、Undefined、Null、Symbol、Bigint。\

引用数据类型:也就是对象类型Object type,比如:对象(Object)、数组(Array)、函数(Function)、日期(Date)、正则表达式(RegExp)。

so正则表达式属于引用数据类型,按传统思维肯定是需要“深拷贝”的,需要new 一个新Object。

const regular = /111/g;
    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        // 正确写法 new RegExp的内存指向在循环过程中每次都单独开辟一个新的“对象”,不会和前几次的循环regular.test(xxx)改变结果而混淆
        // console.log('log_________' + /111/g.test(element)); // 这样写当然也行
        console.log('log_________' + new RegExp(regular).test(element)); // 打印OK了
    });

OK了。

总结

到此这篇关于js循环中使用正则失效异常的踩坑的文章就介绍到这了,更多相关js循环中正则失效异常内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: js循环中使用正则失效异常的踩坑实战

本文链接: https://www.lsjlt.com/news/212782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • js循环中使用正则失效异常的踩坑实战
    目录1、异常案例:2、原因分析3、解决方法13、解决方法23、解决方法3总结1、异常案例: 使用正则匹配111 const regular = /111/g; // 匹配111 ...
    99+
    2023-05-19
    js循环中正则失效异常什么意思 正则表达式 循环 js 常用正则
  • JAVA中简单的for循环异常踩坑
    目录引言踩坑操作foreach循环剔除方式下标循环操作正确方式迭代器方式Lambda表达式Stream流操作中间对象辅助方式引言 实际的业务项目开发中,大家应该对从给定的list中剔...
    99+
    2024-04-02
  • Vue3中使用vant的踩坑实战日记
    目录前言一、下载vant二、下载插件三、配置插件四、简单使用五、我的解决方法总结前言 我照着视频中老师教的方式去使用vant(和官网教程一样),发现样式根本不起作用(想截个图来着,但...
    99+
    2022-11-13
    vue3 vant vue3 vant demo
  • JS循环中正确使用async、await的姿势分享
    目录概览(循环方式 - 常用)声明遍历的数组和异步方法for 循环中使用map 中使用forEach 中使用filter 中使用附使用小结总结概览(循环方式 - 常用) f...
    99+
    2024-04-02
  • JS循环中正确使用async、await的方法是什么
    JS循环中正确使用async、await的方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概览(循环方式 - 常用)formapforEachfilter声明遍历的...
    99+
    2023-06-22
  • Python循环语句使用中异常现象的处理方法
    本篇内容介绍了“Python循环语句使用中异常现象的处理方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!break语句用于立刻中止循环,c...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作