javascript – 连续调用RegExp测试失败的模式与全局选项

前端之家收集整理的这篇文章主要介绍了javascript – 连续调用RegExp测试失败的模式与全局选项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> Why RegExp with global flag in Javascript give wrong results?4个
我一整天都在摔跤,我无法确定我是否在做错事,或者我在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”标志无论如何都会产生奇怪的语义含义.

猜你在找的JavaScript相关文章