0

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

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

在评估表达式时,它将继续在真假之间交替。这是一个问题,因为我在字符串列表上使用了相同的编译正则表达式,导致一些在应该为真时评估为假。

4

3 回答 3

2

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

我问过同样的问题

于 2013-04-05T00:42:56.310 回答
1

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

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

本质上,该RegExp对象x在内部跟踪其最后一次匹配。当您.test再次调用时,它会尝试在"w"

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

> /w/gi.test('Women')
true
> /w/gi.test('Women')
true
于 2013-04-05T00:43:24.197 回答
1

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

当没有找到匹配项时,它将返回 null,并lastIndex重置为 0。这就是您的测试不断交替的原因。它将匹配W, 然后lastIndex设置为 1。下次调用它时,将返回 null 并lastIndex重置。

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

于 2013-04-05T07:29:48.780 回答