我能够解决这个问题,因为事实证明我不需要 /g。但我想知道是否有人能够解释为什么会发生以下行为。
x = RegExp( "w", "gi" )
x.test( "Women" )
= true
x.test( "Women" )
= false
在评估表达式时,它将继续在真假之间交替。这是一个问题,因为我在字符串列表上使用了相同的编译正则表达式,导致一些在应该为真时评估为假。
我能够解决这个问题,因为事实证明我不需要 /g。但我想知道是否有人能够解释为什么会发生以下行为。
x = RegExp( "w", "gi" )
x.test( "Women" )
= true
x.test( "Women" )
= false
在评估表达式时,它将继续在真假之间交替。这是一个问题,因为我在字符串列表上使用了相同的编译正则表达式,导致一些在应该为真时评估为假。
您不应该在用于 的正则表达式中使用全局修饰符test
,因为它保留了最后一次搜索的索引并从那里开始下一个测试。
我问过同样的问题。
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
当您使用该g
标志时,正则表达式将匹配的结束位置存储在其lastIndex
属性中。下次您调用 、 或 中的任何一个时test()
,exec()
正match()
则表达式将从字符串中的该索引开始尝试查找匹配项。
当没有找到匹配项时,它将返回 null,并lastIndex
重置为 0。这就是您的测试不断交替的原因。它将匹配W
, 然后lastIndex
设置为 1。下次调用它时,将返回 null 并lastIndex
重置。
与此相关的一个陷阱是您的正则表达式可以匹配空字符串。在那种情况下,lastIndex
不会改变,如果你得到所有匹配,就会有一个无限循环。在这种情况下,您应该手动调整lastIndex
它是否与空字符串匹配。