js在循环中使用正则失效异常的坑

这篇具有很好参考价值的文章主要介绍了js在循环中使用正则失效异常的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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了。文章来源地址https://www.toymoban.com/news/detail-429394.html

到了这里,关于js在循环中使用正则失效异常的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go中 for循环的坑

    在使用for循环修改结构体切片中的值时,发现并没有修改成功。 结果切片中dog的name并没有全部变为123,后来查资料才知道for循环中的dog其实是个变量,指向的并不是真正的dog。 打印其地址对比可以看出压根就不同。 若要修改切片中的dog的name,应该按照以下这么写,或者将

    2023年04月26日
    浏览(22)
  • Python 的运算符和语句(条件、循环、异常)基本使用指南

    算数运算符 赋值运算符 复合赋值运算符 比较运算符 逻辑运算符 算数运算符 运算符 描述 实例 + 加 1 + 1 输出结果为 2 - 减 1 - 1 输出结果为 0 * 乘 2 * 2 输出结果为 4 / 除 10 / 2 输出结果为 5 // 整除 9 // 4 输出结果为 2 % 取余 9 % 4 输出结果为 1 ** 指数 2 ** 4 输出结果为 16, 2 * 2

    2024年02月07日
    浏览(49)
  • CompletableFuture异步关于异常的坑

    写一个存在异常的程序,让其异步执行 结果:接口返回成功,控制台没有打印错误信息。 结果:接口返回失败,控制台打印异常日志。 异步方法中get()是阻塞的,在使用时要设置超时时间。 结果:接口返回成功,控制台打印异常信息。 结果:接口返回成功,控制台打印异步

    2024年02月08日
    浏览(28)
  • PHP快速入门09-正则相关,附一定要学会的20个高频使用案例

    本文已收录于PHP全栈系列专栏:PHP快速入门与实战 正则表达式(Regular Expression)是一种字符序列,用于描述一组字符串匹配某个模式或格式。 它由一些特殊的字符和普通字符组成,可以表示一些特定的文本模式,如手机号码、邮箱、网址等等。正则表达式在很多程序设计语

    2023年04月17日
    浏览(43)
  • 匿名函数和常见是内置函数(配合匿名使用)和for循环的原理,异常的捕获

    匿名函数 常见的内置函数(配合匿名函数使用) 可迭代对象 迭代器对象 for循环内部原理 异常捕获

    2024年02月09日
    浏览(38)
  • 记录学习Mockito单元测试的坑——空指针异常

    正确引用 正确使用 正确包名

    2024年02月16日
    浏览(28)
  • 解决SpringBoot项目中@RestControllerAdvice全局异常失效问题

    使用@RestControllerAdvice添加了全局异常,但没有生效 方式1:@ExceptionHandler 所在类没有被Spring管理 因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描 方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面

    2024年02月09日
    浏览(29)
  • Java中代码Bug记录--泛型失效、数组删除、HashMap死循环

    最近在工作的过程中,遇到了不少奇怪自己或者同事的Bug,都是一些出乎意料的,不太容易发现的,记录一下来帮助可能也遇到了这些Bug的人 上面的代码,我们很容易看出来,无法通过编译,因为Map的value需要的是一个String,但我们传的是一个int。但我只要稍微改一下: 同样

    2024年02月16日
    浏览(34)
  • sh 脚本循环语句和正则表达式

    目录 1、循环语句 1、for 2、while 3、until 2、正则表达式 1、元字符 2、表示次数 3、位置锚定 4、分组 5、扩展正则表达式 循环含义 将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件 重复运行次数 循环次数事先已知 循环次数事先未知 for 为 已知循环数 相对于

    2024年02月12日
    浏览(30)
  • C++/Qt中异常处理try-catch语句的使用方式及场景案例

    try-catch语句用于捕获和处理异常,它的基本语法如下: ```cpp try {     // 可能会抛出异常的代码块 } catch (ExceptionType1 e1) {     // 处理 ExceptionType1 类型的异常 } catch (ExceptionType2 e2) {     // 处理 ExceptionType2 类型的异常 } catch (...) {     // 处理其他类型的异常 } ``` 在try块中,我

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包