为什么相同的RegExp表现不同?

Joe*_*Joe 12 javascript regex

可能重复:
Javascript RegExp的有趣测试
正则表达式测试无法在true和false之间做出决定(JavaScript)

问题的例子.在内联运行时,结果如我所料.但是当存储为变量时,它会跳过中间跨度元素.

// Inline RegExp
function getToggleClasses() {
  var toggler = [],
      elements = document.getElementsByTagName("*"),
      i=0,
      len = elements.length;

  for (i; i < len; i++) {
    if (/toggler/g.test(elements[i].className)) {
      toggler.push(elements[i]);
    }
  }

  document.getElementById('results').innerHTML += "<br />Inline: " + toggler.length;
}

// Variable
function getToggleClasses2() {
  var toggler = [],
      elements = document.getElementsByTagName("*"),
      tester = /toggler/g,
      i=0,
      len = elements.length;

  for (i; i < len; i++) {
    if (tester.test(elements[i].className)) {
      toggler.push(elements[i]);
    }
  }

  document.getElementById('results').innerHTML += "<br />Variable: " + toggler.length;
}
?
Run Code Online (Sandbox Code Playgroud)

标记:

<span class="toggler">A</span>
<span class="toggler">B</span>
<span class="toggler">C</span>
Run Code Online (Sandbox Code Playgroud)

鉴于:我理解没有理由使用RegExp进行这种比较,我也理解jQuery这样的优秀库.我也知道g在这种情况下不需要.

我无法理解为什么这两种方法应该返回不同的结果.

Mat*_*all 9

RegExp实例是有状态的,因此重用它们会导致意外行为.在这种特殊情况下,这是因为实例是全局的,这意味着:

应该针对字符串中的所有可能匹配来测试正则表达式.

然而,这不是使用造成的唯一差异g.来自RegExp.test@ MDN:

exec(或与之结合使用)一样,test在同一个全局正则表达式实例上多次调用将超过前一个匹配.


删除g标志,或者设置lastIndex0(感谢, @zzzzBov).

  • 或者将`lastIndex`设置为'0` ... (3认同)