Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么同一个RegExp的行为不同?_Javascript_Regex - Fatal编程技术网

Javascript 为什么同一个RegExp的行为不同?

Javascript 为什么同一个RegExp的行为不同?,javascript,regex,Javascript,Regex,可能重复: 。当内联运行时,结果与我预期的一样。但当存储为变量时,它会跳过中间跨度元素 // Inline RegExp function getToggleClasses() { var toggler = [], elements = document.getElementsByTagName("*"), i=0, len = elements.length; for (i; i < len; i++) { if (/toggl

可能重复:

。当内联运行时,结果与我预期的一样。但当存储为变量时,它会跳过中间跨度元素

// 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;
}
​
//内联RegExp
函数getToggleClasses(){
var-toggler=[],
elements=document.getElementsByTagName(“*”),
i=0,
len=元素长度;
对于(i;i内联:“+toggler.length;
}
//变数
函数getToggleClasses2(){
var-toggler=[],
elements=document.getElementsByTagName(“*”),
测试器=/toggler/g,
i=0,
len=元素长度;
对于(i;i变量:“+toggler.length;
}
​
加价:

<span class="toggler">A</span>
<span class="toggler">B</span>
<span class="toggler">C</span>
A
B
C
给定的: 我知道没有理由使用RegExp来进行这种比较,我也知道jQuery这样的库有多棒。我还知道在这种情况下不需要
g

我不明白为什么这两种方法会返回不同的结果。

/g
不需要,也不应该在这种情况下使用

这些情况下的行为有所不同,因为在“内联”情况下,每次循环迭代都会重新创建regex对象。而在中,变量只创建一次,并在循环迭代之间保持其状态()

将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;
}
//变量
函数getToggleClasses2(){
var-toggler=[],
elements=document.getElementsByTagName(“*”),
i=0,
len=元素长度;
对于(i;i变量:“+toggler.length;
}

RegExp
实例是有状态的,因此重用它们可能会导致意外行为。在这种情况下,这是因为实例是,意思是:

正则表达式应该根据字符串中所有可能的匹配项进行测试

然而,这并不是使用
g
造成的唯一区别:

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



,或(谢谢)。

正则表达式维护一个名为
lastIndex
的变量,该变量是开始下一次搜索的索引。发件人:

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


当为每次迭代定义内联正则表达式时,状态将丢失,
lastIndex
始终为0,因为每次都有一个新的正则表达式。如果将正则表达式保持在可验证状态,则
lastIndex
将保存为最后一个匹配的结束位置,在本例中,这将导致下一次搜索在下一个字符串的结尾处开始,从而导致匹配失败。当第三次比较出现时,
lastIndex
被重置为0,因为正则表达式知道它上次没有得到结果。

是的,我得到了。但我很想知道为什么。因为
/toggler/g.test('toggler');//是的
@Joe,你在问题中写道“我也知道需要
g
”,这就是为什么我声明它不是。这只是个人偏好,但我认为在正则表达式文本周围加上括号会提高清晰度,在对该文本调用函数时,该文本带有标志。@apsillers,你是对的。你是怎么找到这些的?我找不到要搜索什么才能得到我想要的结果。我有点作弊,搜索了
[javascript]regex test lastindex
——我很确定以前有人问过这样的问题,我知道答案会包括文本
lastindex
。这是一个很好的案例,表明重复问题的存在并不一定表明提问者疏忽大意;对于一个难以搜索的问题,您提出了一个措辞恰当的问题。