RegExp不是确定性的吗?

时间:2019-07-11 16:13:44

标签: javascript regex

我当时正在检查一个简单的正则表达式,以检查一个单词是否有字母,因此我使用了类似的内容:

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的模式...这有关系吗?

1 个答案:

答案 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);