JavaScript正则对象的exec方法与字符串的match方法对比

正则对象的exec()方法

  • 语法
    regexp.exec(str)
  • 返回值(分两种情况)
    1. 正则表达式不带g(global)或y(sticky)属性时
        返回一个数组,数组元素的第一项是第一个全匹配字符串,接下来依次是捕获组字符串。并且该数组带有两个额外属性:index和input。index为第一次全匹配字符串的位置,input为原字符串的值。看下面例子:
      var reg = /\d{1,3}([a-f]*)(M)/;
      var str = "s123abcM456fff";
      const result = reg.exec(str);
      console.log(result,result.index,result.input);
      //输出["123abcM", "abc", "M"],1,s123abcM456fff
      
    2. 正则表达式带g(global)或y(sticky)属性时
        当正则对象带有g或y属性时,表明该正则对象是有状态的,每次执行exec()方法会更新正则对象的lastIndex的值,下次执行exec()时从lastIndex处开始查找,匹配失败时重置lastIndex值为0。返回结果与上面类似,也是一个数组,第一项是全匹配字符串,接下来依次是捕获组字符串,数组带有额外index和input属性。看下面例子:
      var reg = /\d{1,3}([a-f]*)(M)/g;
      var str = "s123abcM456fffM";
      const result = reg.exec(str);
      console.log(result,result.index,reg.lastIndex);
      // 输出["123abcM", "abc", "M"],1,8
      const result2 = reg.exec(str);
      console.log(result2,result2.index,reg.lastIndex);
      // 输出["456fffM", "fff", "M"],8,15
      const result3 = reg.exec(str);
      console.log(result3,reg.lastIndex);
      // 输出null,0  因为位置15是字符串末尾,匹配失败,重置正则对象的lastIndex属性为0
      
       - 即使下次执行exec()方法时,查找字符串换了,即参数str变了,还是会从lastIndex处开始匹配。
       - 上面两种说的都是匹配成功时的返回结果,若匹配失败,则返回null。
      
  • 小结
      上面两种的不同之处在于一个是没状态的,一个是有状态的,没状态的每次执行exec()方法都会返回相同的结果,有状态的每次执行exec()后会更新lastIndex的值,下次执行exec()从lastIndex处开始查找,返回结果可能是不一样的。

字符串的match()方法

  • 语法
    str.match(regexp)
  • 返回值(分两种情况)
    1. regexp不带g属性
        当正则表达式不带g属性时,str.match(regexp)与regexp.exec(str)会返回一样的结果。这里只给出定论,就不做验证了。
    2. regexp带有g属性时
        当正则表达式带有g属性时,返回的结果是一个数组,包含所有的全匹配字符串,不包含捕获组,并且此时数组没有index和input属性。看下面例子:
      var reg = /\d{1,3}([a-f]*)(M)/g;
      var str = "s123abcM456fffM";
      const result = str.match(reg);
      console.log(result, result.index, result.input);
      // 输出 ["123abcM", "456fffM"] undefined undefined
      

总结

  当正则表达式不带g属性时,regexp.exec(str)与str.match(regexp)返回结果相同。
  当正则表达式带有g属性时,表明正则对象是有状态的,regexp.exec(str)方法每次执行会更新regexp的lastIndex值;str.match(regexp)返回一个包含所有全匹配字符串的数组,该数组没有额外的index和input属性。
  exec()与match()匹配失败时都会返回null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值