这个问题在这里已经有一个答案:>
Why RegExp with global flag in Javascript give wrong results?4个
我一整天都在摔跤,我无法确定我是否在做错事,或者我在Chrome的JavaScript引擎中发现了一个错误.看起来,对具有全局标志的RegExp对象的连续调用对于相同的输入字符串返回不一致的结果.我正在测试以下功能:
我一整天都在摔跤,我无法确定我是否在做错事,或者我在Chrome的JavaScript引擎中发现了一个错误.看起来,对具有全局标志的RegExp对象的连续调用对于相同的输入字符串返回不一致的结果.我正在测试以下功能:
function testRegex(pattern,array) { document.writeln('Pattern = ' + pattern + ',Array = ' + array + '<br/>'); for (var ii = 0; ii < array.length; ii++) { document.writeln(ii + ','); document.writeln(array[ii] + ','); document.writeln(pattern.test(array[ii]) + '<br />'); } document.writeln('<br/>'); }
当我使用/ a / g作为模式和各种字符串数组调用函数时,我得到以下结果,其中许多是不正确的,据我所知:
// EXPECTED: True // ACTUAL: True testRegex(/a/g,['a']); // EXPECTED: True,True // ACTUAL: True,False testRegex(/a/g,['a','a']); // EXPECTED: True,True,False,True testRegex(/a/g,'a','b',False testRegex(/a/g,True testRegex(/a/g,'a']);
当我使用相同的字符串数组调用相同的函数,但将/ a /作为模式时,实际结果与预期的结果相匹配.
// EXPECTED: True // ACTUAL: True testRegex(/a/,True testRegex(/a/,'a']);
我创建了一个上面代码的工作示例:http://jsfiddle.net/FishBasketGordo/gBWsN/
我错过了什么吗?对于给定的字符串数组,不管结果是否相同,无论模式是全局的还是不全局的?请注意,我主要是在Chrome中工作,但是我在Firefox 4和IE 8中观察到类似的错误结果.
解决方法
如果您更改测试循环如下:
for (var ii = 0; ii < array.length; ii++) { document.writeln(ii + ','); document.writeln(array[ii] + ','); document.writeln(pattern.test(array[ii]) + '<br />'); pattern.lastIndex = 0; }
那么你的代码将会工作.问题是“g”标志导致RegExp对象被卡住.由于“g”,该循环的第一次迭代后,“lastIndex”值被设置为1.如果您没有将其设置为重置搜索,那么它假设在第二个呼叫中,您要求它从偏移量1继续.
在“.replace()”调用的上下文之外的正则表达式上使用“g”标志无论如何都会产生奇怪的语义含义.