我能够解决这个问题,因为事实证明我并不需要/ g。但我想知道是否有人能够解释为什么会发生以下行为。
x = RegExp( "w", "gi" )
x.test( "Women" )
= true
x.test( "Women" )
= false
在评估表达式时,它将继续在true和false之间交替。这是一个问题,因为我在字符串列表中使用相同的编译RegExp,导致一些在它们应该为真时评估为false。
答案 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
。