Javascript RegExp用全局修饰器产生不寻常的结果

Javascript RegExp Producing Unusual Results with Global Modifer

本文关键字:不寻常 结果 RegExp 全局 Javascript      更新时间:2023-09-26

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

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

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

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

我也问过同样的问题。

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

当没有找到匹配时,它将返回null,并将lastIndex重置为0。这就是为什么你的测试总是交替进行。它将匹配W,然后lastIndex将被设置为1。下次调用它时,将返回null,并重置lastIndex

与此相关的一个陷阱是当您的regex可以匹配空字符串时。在这种情况下,lastIndex将不会改变,如果您获得所有匹配,则会出现无限循环。在这种情况下,您应该手动调整lastIndex,如果它匹配空字符串

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

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

本质上,RegExp对象x在内部跟踪它的最后一次匹配。当您再次调用.test时,它将尝试从"w" 之后开始匹配。

当然,这只适用于regex对象实例。

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