为什么Regex Javascript // g标志影响状态?

时间:2012-03-26 13:34:26

标签: javascript regex

我有another question虽然已经回答了我不明白为什么正则表达式会受到影响

来自w3schools它说

  

g:执行全局匹配(找到所有匹配项,而不是在第一次匹配后停止)

好的。我明白。这就是为什么我在这段代码中得到一个数组

var str="The rain in SPAIN stays mainly in the plain";
var patt1=/ain/gi;
document.write(str.match(patt1));

输出:

ain,AIN,ain,ain 

正则表达式类似,/g它将替换多个实例。

然而在比赛中

var re=/hi/gi;
alert(re.test("hi") + " " + re.test("hi"));

结果是“真假”。

现在为什么$%^&它做到了吗?两个测试中的字符串完全相同!在过去,我认为全球意味着它将搜索新行(这是我想在此测试中做的)。我引用的第一件事是关于g是一场全球比赛。

没有任何关于它的任何参考影响NEXT CALL!没有/ g代码将正常工作(我也不需要跨越换行符)。为什么它会影响下一次测试? gumbo的答案提到它会影响调用的lastIndex以及%^& *我不知道有共享状态,因为其他两个函数在我使用g标志时没有使用它。我只想要一个真假,但如果有什么不匹配则返回一个包含全局匹配数量的int? (即“hi”中的1,但字符串“hihi”中的2)。

为什么在做regex.test时会影响我的下一个电话?如果可以,请提供我真正想要的“功能”

2 个答案:

答案 0 :(得分:9)

在正则表达式中使用全局标志时,会更新lastIndex属性。 lastIndex属性是开始下一场比赛的索引。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

您可以在再次呼叫之前重置最后一个索引。见

Why RegExp with global flag in Javascript give wrong results?

答案 1 :(得分:0)

对我来说,主要的问题似乎是你使用'g'修饰符而不是'm'修饰符,它基本上将'\ n'添加到匹配字符集''。'。

如果您想迭代给定的匹配项,则使用'g'修饰符,请查看http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl(并在该页面上搜索“全局匹配”)。虽然这是Perl文档,但是有一个很好的用例示例。

据我所知,Javascript实现仍然存在缺陷,因为

alert(re.test(new String("hi")) + " " + re.test(new String("xhi")));

产生您描述的结果。但是现在,这两个字符串是不同的对象,它们有不同的值,应该重置re的索引,但很明显,它没有。