Javascript RegExp使用全局修改器生成异常结果
我能够解决这个问题,因为事实证明我不需要/g。但我想知道是否有人能够解释为什么会发生以下行为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中使用全局修饰符,因为它保留了上一次
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