zoukankan      html  css  js  c++  java
  • JS正则表达式从入门到入土(9)—— test方法以及它的那些坑

    test方法

    test方法介绍

    RegExp.prototype.test(str)
    

    test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串

    test方法的使用

    let reg = /w/
    
    reg.test('a')		// true
    
    reg.test('$')		// false
    

    通过结果可以看出,如果测试字符串参数存在匹配正则表达式模式的字符串则返回true,否则返回false

    test方法的那些坑

    当正则表达式使用了全局匹配时,test方法会出现如下的这种奇怪现象:

    let reg = /w/g
    
    reg.test('ab')		// true
    
    reg.test('ab')		// true
    
    reg.test('ab')		// false
    
    reg.test('ab')		// true
    

    可以看到,每轮的第三次匹配返回会变为true,但是,ab不是都符合reg吗,返回都应该返回true才对。原因就在于上一节提到过的lastIndex属性。

    我们可以试试每次都运行test方法都打出reg的lastIndex方法:

    let reg = /w/g
    reg.lastIndex		// 0
    
    reg.test('ab')		// true
    reg.lastIndex		// 1
    
    reg.test('ab')		// true
    reg.lastIndex		// 2
    
    reg.test('ab')		// false
    reg.lastIndex		// 0
    
    reg.test('ab')		// true
    reg.lastIndex		// 1
    

    看看结果,然后回忆下lastIndex的定义,你就明白原因了。

    lastIndex属性是当前表达式匹配内容的最后一个字符的后一位,用于规定下一次匹配的起始位置。

    当进入正则表达式全局模式时,每次使用test方法都会从lastIndex开始,匹配从lastIndex开始的子字符串。比如例子中,第二次执行test方法时,此时,lastIndex已经变为2,子字符串为空,所以reg不可能匹配上它。由于子字符串匹配失败,test方法返回false,并将lastIndex属性置为0,重新开始一轮循环。

    避免test中的坑的方法

    第一种方法:test方法本身就是用来测试是否存在匹配正则的字符串,不使用全局模式一样可以实现目的,所以第一种方法就是不适用全局模式。

    第二种方法:不将正则对象实例存在变量中,每次直接用正则对象实例调用test方法,不过这种方法对内存有所损耗,理论上不建议。

  • 相关阅读:
    DOM
    JavaScript
    自定义特性的简单用法
    项目三--自主开发项目说明
    一维数组进行多位数算数运算-加减乘
    Vs2017发布可在线更新的Winform程序
    C#中使用WCF创建面向网络的服务程序
    datatable转layui表格v2[分页and带模板]【偏实例】
    datatable转layui表格【偏原理】
    MVC下通过jquery的ajax调用webapi
  • 原文地址:https://www.cnblogs.com/karthuslorin/p/9292252.html
Copyright © 2011-2022 走看看