疑难杂记
- 1. 关于正则表达式对象的匹配状态
- 问题发现
- 查找原因
- 解决方法
- done 喜大普奔
1. 关于正则表达式对象的匹配状态
问题发现
因页面中多个函数使用到同一个正则表达式,想着定义个变量 export 出去然后在对应的函数中引用,一切正常中…
直到有一天,测试同学提了个 bug 单,然后就开始排查,debug 发现第二次调用引入正则变量的函数时,正则未生效,奇了怪了…
不管了,先把变量替换成对应正则,好使!先这样!
查找原因
正则表达式对象是有状态的,这意味着它们具有匹配状态,而不仅仅是一组规则。如果你在一个函数中多次使用同一个正则表达式,而这个正则表达式具有全局标志(g),那么在每次调用函数时,匹配状态都会从上一次的位置继续。索引位置,即 lastIndex 属性。
lastIndex 属性:最后一个索引,总是指向下一次查找开始的地方,正则表达式开始下一次查找的索引位置,第一次为0
注:lastIndex 属性在非全局模式下不生效
解决方法
如果想每次都从字符串的开始处开始匹配,可以
- 将正则表达式的全局标志(g)去掉
- 在每次使用前重置正则表达式的 lastIndex 属性
import { regex1, regex2 } from './data.js';function testRegex(str) {// 不带全局标志 每次都会从头开始匹配 不用管const matches1 = str.match(regex1);console.log(matches1);// 带全局标志的正则 每次使用前重置 lastIndex 属性regex2.lastIndex = 0;const matches2 = str.match(regex2);console.log(matches2);
}