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

时间:2015-03-07 03:05:45

标签: javascript regex

为什么以下内容从true转到false;

var r = /e/gi;
r.test('e'); // true
r.test('e'); // false

然后继续切换truefalsetruefalse ......

1 个答案:

答案 0 :(得分:6)

因为g标志。它开始记住匹配的最后一个索引以及下次执行r.test时,它从该索引开始。这就是它在truefalse之间交替的原因。试试这个

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

RegExp.lastIndex

上引用MDN文档
  

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

     

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

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

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