正则重复匹配时不要用g

需要重复使用同一个正则表达式匹配字符串时,千万别加/g!

问题描述

  • 需要用同一个正则重复匹配不同的值是否符合要求,第一遍啥事没有,第二遍啥啥都对,就是匹配值不对,前后顺序调换还是后面的不对

例子

1
2
3
4
5
6
let reg = /^[1-9]\d*$/g // 大于0的整数
let minNum = "11"
let maxNum = "22"

console.log(positiveInteger.test('11'),positiveInteger.test('22')) // true false

结论

  • 需要重复使用同一个正则表达式匹配字符串时,千万别加g!
  • 因为**/g代表全局匹配**,所以判断正则时内部是有一个lastIndex来记录最后匹配的位置.当重复调用的时候,会接着上次的lastIndex继续匹配,故而将导致判断出错.

解决方法

  • 方法1:去掉/g
  • 方法2:第二次匹配前,手动将lastIndex置0,以上面的例子来说:reg.lastIndex()=0即可

参考

,