为什么RegEx.test会在后续调用中更改结果?

Edw*_*oso 6 javascript regex

为什么下面从去truefalse;

var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
Run Code Online (Sandbox Code Playgroud)

然后继续切换true,false,true,false......

the*_*eye 6

因为g旗帜.它开始记住匹配的最后一个索引,当你r.test下次做的时候,它从那个索引开始.这就是它true和之间交替的原因false.试试这个

var r = /e/gi;
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
console.log(r.lastIndex);
# 0
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
Run Code Online (Sandbox Code Playgroud)

引用MDN文档RegExp.lastIndex,

lastIndex是正则表达式的读/写整数属性,指定开始下一个匹配的索引....

仅当正则表达式使用"g"标志指示全局搜索时才设置此属性.以下规则适用:

  1. 如果lastIndex大于字符串的长度大,test()并且exec()失败,则lastIndex设置为0.
  2. 如果lastIndex等于字符串的长度,并且正则表达式与空字符串匹配,则正则表达式匹配从开始的输入lastIndex.
  3. 如果lastIndex等于字符串的长度,并且正则表达式与空字符串不匹配,则正则表达式与输入不匹配,并lastIndex重置为0.
  4. 否则,lastIndex设置为最近一次匹配后的下一个位置.

上面的粗体文字回答了您观察到的行为.在第一次匹配之后e,将lastIndex设置为1,以指示应尝试下一次匹配的索引.根据上面的第三点,由于lastIndex它等于字符串的长度并且正则表达式与空字符串不匹配,因此它返回false并重置lastIndex为0.

  • 很好的解释!我感觉自己好像在服用疯狂的药物。 (2认同)