红叶何时落水
问题
let a = 'a.so';
let reg = /.so/g;
console.log( a,reg.test(a));
console.log( a,reg.test(a));
//输出
17:09:29.940 a.so true at IF_bug.html:43
17:09:29.942 a.so false at IF_bug.html:44
同一个变量a,两次匹配,结果却不同;这是为何?
原因在于RegExp.lastIndex属性
lastIndex
是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。
只有正则表达式使用了表示全局检索的 "g
" 标志时,该属性才会起作用。此时应用下面的规则:
- 如果
lastIndex
大于字符串的长度,则regexp.test
和regexp.exec
将会匹配失败,然后lastIndex
被设置为 0。 - 如果
lastIndex
等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从lastIndex
开始的字符串。(then the regular expression matches input starting atlastIndex
.) - 如果
lastIndex
等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex
被设置为 0.。 - 否则,
lastIndex
被设置为紧随最近一次成功匹配的下一个位置。
let a = 'a.so';
let reg = /.so/g;
console.log( reg.lastIndex, reg.test(a), reg.lastIndex);
console.log( reg.lastIndex, reg.test(a), reg.lastIndex);
//输出
17:13:41.029 0 true 4 at IF_bug.html:43
17:13:41.037 4 false 0 at IF_bug.html:44
解决方案
1.去掉全局检索的 "g
";
2.待续。。。