Zmagałem się z tym przez cały dzień i nie mogę się dowiedzieć, czy robię coś źle, czy też znalazłem błąd w silniku JavaScript Chrome . Wygląda na to, że kolejne wywołania do obiektu RegExp
z flagą globalną zwracają niespójne wyniki dla tego samego ciągu wejściowego. Ja badania z następujących funkcji:Kolejne wywołania testu RegExp kończą się niepowodzeniem w przypadku wzorca z globalną opcją
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/>');
}
Kiedy wywołać funkcję z /a/g
jako wzór i różnych tablic ciągów, mam następujące wyniki, z których wiele jest nieprawidłowy miarę mogę powiedzieć:
// 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']);
Kiedy nazywają tę samą funkcję z tych samych tablic ciągów, ale przechodzą /a/
jako wzór, rzeczywiste rezultaty wszystkie pasujące oczekiwanych rezultatów.
// 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']);
Utworzyłem pracy przykład kodu powyżej: http://jsfiddle.net/FishBasketGordo/gBWsN/
jestem brakuje czegoś? Czy wyniki nie powinny być takie same dla danych tablic ciągów znaków, niezależnie od tego, czy wzór jest globalny czy nie? Uwaga, mam przede wszystkim pracuje w Chrome, ale już zaobserwować podobne nieprawidłowych wyników w Firefox 4 i IE 8.
Moim celem wychodząc rano było ostatecznie użyć RegExp w 'replace', dlatego byłem za pomocą opcji globalnych na początku, ale jak mój RegExp, utknąłem na etapie pośrednim . – FishBasketGordo