zoukankan      html  css  js  c++  java
  • js 正则表达式 test match exec三个方法的异同

    方法 match exec test
    调用方法 str.match(reg) reg.exec(str) reg.test(str)
    说明 如果正则式为全局匹配,则返回所有匹配的字符串,但是当有子表达式时,不匹配子表达式,只执行全局匹配

    如果正则式为全局匹配,只返回存在的第一个匹配结果,但是当有子表达式时,返回值不仅有全局匹配,还匹配子表达式

    在使用 "g" 参数时,exec() 的工作原理如下:

    • 找到第一个 "e",并存储其位置
    • 如果再次运行 exec(),则从存储的位置开始检索,并找到下一个 "e",并存储其位置
    (r.exec(s) != null)与r.test(r)是等价的
    返回值 数组,匹配的字符串 数组,匹配的字符串 布尔值,匹配成功则为true

    示例1:

    如果定义正则表达对象为全局匹配如:

    var reg = new RegExp("abc","g") ; 
    var str = "3abc4,5abc6";
    alert(reg.exec(str));
    alert(str.match(reg)); 

    则 为abc和abc,abc;因为match执行了全局匹配查询;而exec如果没有子表达式只会找到一个匹配的即返回。

    示例2:

    当如果正则表达式对象定义为为全局匹配

    var reg = new RegExp("a(bc)","g") ; 
    var str = "3abc4,5abc6";
    alert(reg.exec(str));
    alert(str.match(reg));

    则两者返回的结果分别为abc,bc和abc,abc,

    对于test方法,有一个可能会踩的坑是连续两次调用该方法来检测时第二次会返回错误值false
    例如:
    var re = /^[1-9]d{4,10}$/gi;
    var str = "123456";
    alert(re.test(str));     //返回true
    str = "1234567";
    alert(re.test(str));     //返回false
     
    var re = /^[1-9]d{4,10}$/gi;
    var str = "123456";
    alert(re.test(str));      //返回true

    // 执行上面的 test 之后
    我们可以弹出
    alert(re.lastIndex); // 弹出6
    即表示上一次在第6个字符之后结束
    那么下一次再调用 test 的时候, 就会从第6个字符之后继续搜索

    解决办法:
    1 将正则表达式的 lastIndex 属性设置为0

    2 正则模式去掉全局模式,把g去掉就行了

    改成var re = /^[1-9]d{4,10}$/i;
    var str = "123456";
    alert(re.test(str));      //返回true
    str = "1234567";
    alert(re.test(str));      //返回true
     
     
  • 相关阅读:
    26 转义符 re模块 方法 random模块 collection模块的Counter方法
    25 正则表达式
    24 from 模块 import 名字
    24 from 模块 import 名字
    24 from 模块 import 名字
    23 析构方法 items系列 hash方法 eq方法
    21 isinstance issubclass 反射 _str_ _new_ _len_ _call_
    20 属性, 类方法, 静态方法. python2与python3的区别.
    python(1)
    python之字符串格式化
  • 原文地址:https://www.cnblogs.com/Zoe-only/p/5040828.html
Copyright © 2011-2022 走看看