Javascript RegEx使用全局修改器生成异常结果

时间:2013-04-05 00:41:32

标签: javascript regex

我能够解决这个问题,因为事实证明我并不需要/ g。但我想知道是否有人能够解释为什么会发生以下行为。

x = RegExp( "w", "gi" )
x.test( "Women" )
    = true
x.test( "Women" )
    = false

在评估表达式时,它将继续在true和false之间交替。这是一个问题,因为我在字符串列表中使用相同的编译RegExp,导致一些在它们应该为真时评估为false。

3 个答案:

答案 0 :(得分:2)

您不应该在用于test的正则表达式中使用全局修饰符,因为它会保留上次搜索的索引并从那里开始下一个测试。

我问了same question

答案 1 :(得分:1)

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test

  

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

基本上,RegExp对象x会在内部跟踪其最后一场比赛。当您再次致电.test时,它会尝试在"w"

之后开始匹配

当然,这只适用于正则表达式对象实例。

> /w/gi.test('Women')
true
> /w/gi.test('Women')
true

答案 2 :(得分:1)

当您使用g标志时,正则表达式将匹配的结束位置存储在其lastIndex属性中。下次调用test()exec()match()中的任何一个时,正则表达式将从字符串中的该索引开始尝试查找匹配项。

如果未找到匹配项,则返回null,并将lastIndex重置为0.这就是您的测试保持交替的原因。它将匹配W,然后lastIndex将设置为1.下次调用它时,将返回null,并且lastIndex将被重置。

与此相关的一个陷阱是你的正则表达式可以匹配空字符串。在这种情况下,lastIndex不会改变,如果你得到所有的匹配,就会有一个无限循环。在这种情况下,如果匹配空字符串,则应手动调整lastIndex