Я боролся с этим весь день, и я не могу понять, что я делаю что-то неправильно или я обнаружил ошибку в движке JavaScript Chrome. Похоже, что последовательные вызовы объекта 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.