js正则表达式连续调用多次test方法的问题

最近在写一道简单leetcode,仅反转字符串的字母。很容易就想到用正则表达式去匹配嘛,然后问题就来了
这是我一开始写的逻辑:

var reverseOnlyLetters = function(s) {
  let temp = new RegExp(/[a-zA-Z]/,'g');
  let l=0,r=s.length-1;
  s = Array.from(s)
  while(l<r){
    while(r>=0 && !temp.test(s[r])) r--;
    while(l<s.length && !temp.test(s[l])) l++;
    if(l>=r){
      break;
    }
    [s[l],s[r]] = [s[r],s[l]]
    l++,r--;
  }
  return s.join('');
};

但是test的时候得不到预想的结果,控制台打印的时候也有意想不到的结果:我发现在s[l]完全没有变化的情况下,连续调用test方法得到的结果是不同的,eg.第一次结果为true,第二次再调用就为false。后来改成用match方法,代码就ac了。
后来查询资料发现,是跟匹配模式以及正则表达式对象的lastIndex属性有关。

MDN文档说明:
lastIndex 是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。

只有正则表达式使用了表示全局检索的 “g” 或者粘性检索的 “y” 标志时,该属性才会起作用。此时应用下面的规则:
如果 lastIndex 大于字符串的长度,则 regexp.test 和 regexp.exec 将会匹配失败,然后 lastIndex 被设置为 0。
如果 lastIndex 等于或小于字符串的长度,则该正则表达式匹配从 lastIndex 位置开始的字符串。
如果 regexp.test 和 regexp.exec 匹配成功,lastIndex 会被设置为紧随最近一次成功匹配的下一个位置。
如果 regexp.test 和 regexp.exec 匹配失败,lastIndex 会被设置为 0

解决方法:
1.关闭全局匹配模式
2.在每次调用exec或test方法前设置正则表达式对象的lastIndex=0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值