javascript - 为什么相同的RegExp行为不同?

  显示原文与译文双语对照的内容
0 0

可能Duplicate :
Interesting考验Javascript RegExp?
Regular表达式测试不知该点true和false ( Javascript )?

Example 问题。 当运行Ƕ结果符合我想要的。 但作为一个变量保存它时将跳过中间的span元素。

// 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;
}
​

标记:

<span class="toggler">A</span>
<span class="toggler">B</span>
<span class="toggler">C</span>

假设 : 我知道没有理由使用RegExp为此比较我也理解库,如JQuery有多大。 我也知道 g在这种情况下,不需要。

我不理解为什么这两个方法应该会返回不同的结果。

时间:原作者:6个回答

0 0

RegExp实例是有状态的,所以在重用会导致意外行为。 在这个例子中,因为该实例的全局 ,含义:

正则表达式中应该就会对所有可能匹配项的字符串。

这不是唯一的不同原因是使用 g但是。 FromRegExp.test@ mdn :

就像使用 exec( 或结合使用它), test全球将使我国过去正规表达式实例上多次调用相同的上一个匹配项。


Removeg标志,或者设置lastIndex0( 谢谢 @zzzzBov ) 。

原作者:
0 0

/g不是需要且不应在这种情况下使用。

中的行为在这些情况有所不同,因为" 内联" 情况下循环的每次迭代将重新创建regex对象。 而在该变量只被创建一次,并使其状态( lastIndex) 之间循环迭代。

var移动到循环你就能得到相同的结果:

// Variable
function getToggleClasses2() {
  var toggler = [],
      elements = document.getElementsByTagName("*"),
      i=0,
      len = elements.length;
  for (i; i < len; i++) {
    var tester = /toggler/g;
    if (tester.test(elements[i].className)) {
      toggler.push(elements[i]);
    }
  }
  document.getElementById('results').innerHTML += "<br />Variable: " + toggler.length;
}
原作者:
0 0

regex中维护一个变量叫做 lastIndex,即开始进行下一次搜索的索引。 从 MDN

就像使用 exec( 或结合使用它), test全球将使我国过去正规表达式实例上多次调用相同的上一个匹配项。

定义内联regex每次迭代时,该状态将丢失, lastIndex始终为0,因为每次有一个新的regex 。 如果你把regex veriable中, lastIndex保存为最后一个匹配的结束位置,在本例中该使下一个搜索开始的末尾下一个字符串,从而导致失败的匹配。 当第三个比较因, lastIndex已重置为0,因为最后一次正则表达式对这个问题没结果。

原作者:
...