我当时正在检查一个简单的正则表达式,以检查一个单词是否有字母,因此我使用了类似的内容:
new RegExp(/[A-Z]/gi)
每次用户更改输入时都会执行/测试此正则表达式,假设它的输入速度非常快,所以我创建了这个小片段:
const hasLettersExpression = new RegExp(/[A-Z]/gi);
const hasLetters = str => hasLettersExpression.test(str);
for (let i = 0; i < 10; i++) {
// we always test against the same string.
console.log(i, '--->', hasLetters('12ab'))
}
从我的角度来看,它给出了以下结果:
0 ---> true
1 ---> true
2 ---> false
3 ---> true
4 ---> true
5 ---> false
6 ---> true
7 ---> true
8 ---> false
9 ---> true
这是不正确的,因为它应始终返回true
。
有人知道为什么会这样吗?有true, true, false
的模式...这有关系吗?
答案 0 :(得分:2)
使用全局'g'
标志创建的正则表达式将在调用test
时记住上一个匹配索引。
如果正则表达式设置了全局标志,则test()将使正则表达式的lastIndex前进。随后使用test()将在lastIndex指定的str的子字符串处开始搜索(exec()还将推进lastIndex属性)。值得注意的是,在测试其他字符串时,lastIndex不会重置。 (mdn)
const regex = new RegExp(/[A-Z]/gi);
const str = '12ab';
for (let i = 0; i < 10; i++)
console.log(i, '--->', regex.test(str), regex.lastIndex);