2013-04-05 51 views
0

我能够解决此问题,因为事实证明我不需要/ g。但我想知道是否有人能够解释为什么会出现以下行为。Javascript RegExp使用全局修改器生成异常结果

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

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

回答

1

当您使用g标志,正则表达式店赛后在其lastIndex财产的结束位置。下次您拨打test(),exec()match()中的任意一个时,正则表达式将从字符串中的该索引开始尝试并找到匹配项。

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

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

2

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

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