使用/ g的Javascript Regex文字多次使用

Vje*_*eux 17 javascript regex

使用Javascript Regexp.exec函数时,我遇到了一个奇怪的问题.当多次调用new(我猜...)regexp对象的函数时,它每两次运行一次.我根本不明白为什么!

这是一个小循环示例,但它在函数中使用一次并多次调用时执行相同的操作.

for (var i = 0; i < 5; ++i) {
  console.log(i, (/(b)/g).exec('abc'));
}

> 0 ["b", "b"]
> 1 null
> 2 ["b", "b"]
> 3 null
> 4 ["b", "b"]
Run Code Online (Sandbox Code Playgroud)

删除/ g时,它恢复正常.

for (var i = 0; i < 5; ++i) {
  console.log(i, (/(b)/).exec('abc'));
}             /* no g ^ */

> 0 ["b", "b"]
> 1 ["b", "b"]
> 2 ["b", "b"]
> 3 ["b", "b"]
> 4 ["b", "b"]
Run Code Online (Sandbox Code Playgroud)

我想有一个优化,保存正则表达式对象,但它似乎很奇怪.

这种行为在Chrome 4和Firefox 3.6上是相同的,但它在IE8中的预期(I).我相信这是有意的,但我找不到那里的逻辑,也许你能够帮助我!

谢谢

Poi*_*nty 18

如果您要重用相同的正则表达式,请将其从循环中取出并显式重置:

var pattern = /(b)/g;
for (var i = 0; i < 5; ++i) {
  pattern.lastIndex = 0;
  console.log(i + ' ' + pattern.exec("abc"));
}
Run Code Online (Sandbox Code Playgroud)


Sil*_*ost 16

/g 不适用于简单匹配:

/g实现"全局"匹配.使用该replace()方法时,请指定此修饰符以替换所有匹配项,而不是仅替换第一个匹配项.

我想在捕获后内部javascript保持匹配,因此它将能够恢复匹配,因此null返回,因为b在主题中只发生一次.相比:

for (var i = 0; i < 5; ++i) {
  console.log(i +'    ' + (/(b+)/g).exec("abbcb"));
}
Run Code Online (Sandbox Code Playgroud)

收益:

0 bb,bb
1 b,b
2 null
3 bb,bb
4 b,b
Run Code Online (Sandbox Code Playgroud)