Javascript RegExp使用全局修改器生成异常结果

Javascript RegExp使用全局修改器生成异常结果,javascript,regex,Javascript,Regex,我能够解决这个问题,因为事实证明我不需要/g。但我想知道是否有人能够解释为什么会发生以下行为 x = RegExp( "w", "gi" ) x.test( "Women" ) = true x.test( "Women" ) = false 在计算表达式时,它将继续在true和false之间交替。这是一个问题,因为我在字符串列表上使用了相同的已编译RegExp,导致一些字符串在本应为true时计算为false。您不应该在用于测试的regex中使用全局修饰符,因为它保留了上一次

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

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

在计算表达式时,它将继续在true和false之间交替。这是一个问题,因为我在字符串列表上使用了相同的已编译RegExp,导致一些字符串在本应为true时计算为false。

您不应该在用于测试的regex中使用全局修饰符,因为它保留了上一次搜索的索引,并从那里开始下一次测试


我已经问过了。

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

我已经问过了。

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

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

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

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

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

本质上,
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

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

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

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