使用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)