我整天都在尝试解决这个问题,但我无法确定是我做错了什么还是我发现了Chrome的JavaScript引擎中的一个bug。看起来,对于同一个输入字符串,在使用全局标志的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, True
// ACTUAL: True, False, True
testRegex(/a/g, ['a', 'a', 'a']);
// EXPECTED: True, False, True
// ACTUAL: True, False, True
testRegex(/a/g, ['a', 'b', 'a']);
// EXPECTED: True, True, True, True
// ACTUAL: True, False, True, False
testRegex(/a/g, ['a', 'a', 'a', 'a']);
// EXPECTED: True, False, False, True
// ACTUAL: True, False, False, True
testRegex(/a/g, ['a', 'b', 'b', 'a']);
当我使用相同的字符串数组调用同一函数,但将/a/
作为模式传递时,实际结果都与预期结果匹配。// EXPECTED: True
// ACTUAL: True
testRegex(/a/, ['a']);
// EXPECTED: True, True
// ACTUAL: True, True
testRegex(/a/, ['a', 'a']);
// EXPECTED: True, True, True
// ACTUAL: True, True, True
testRegex(/a/, ['a', 'a', 'a']);
// EXPECTED: True, False, True
// ACTUAL: True, False, True
testRegex(/a/, ['a', 'b', 'a']);
// EXPECTED: True, True, True, True
// ACTUAL: True, True, True, True
testRegex(/a/, ['a', 'a', 'a', 'a']);
// EXPECTED: True, False, False, True
// ACTUAL: True, False, False, True
testRegex(/a/, ['a', 'b', 'b', 'a']);
我已经创建了上面代码的一个可行示例:http://jsfiddle.net/FishBasketGordo/gBWsN/
我有什么遗漏吗?不管模式是否全局,给定的字符串数组结果不应该是相同的吗?请注意,我主要在Chrome中工作,但在Firefox 4和IE 8中也观察到类似的不正确结果。
replace
中的 RegExp,这就是为什么我一开始使用全局选项的原因,但像我的 RegExp 一样,我卡在了中间步骤。 - FishBasketGordo