私は一日中この問題に取り組んできました。何か間違っているのか、ChromeのJavaScriptエンジンにバグが見つかったのか分かりません。グローバルフラグを持つRegExp
オブジェクトへの連続した呼び出しは、同じ入力文字列に対して一貫性のない結果を返すようです。私は、次の機能をテストしています: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']);
Iは、文字列の同一のアレイと同じ関数呼び出しが、パターンとして/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/
私は何かが足りないのですか?パターンがグローバルかどうかに関係なく、指定された文字列の配列の結果が同じではないでしょうか?その後
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;
}
あなたのコードになります。注、私は主にChromeで働いてきましたが、次のように、あなたのテストループを変更した場合、私は、Firefox 4とIE 8
私の目標今朝始め、私はそもそもグローバルオプションを使用していた理由である、最終的にreplace' 'で正規表現を使用することでしたが、私の正規表現のように、私は中間ステップに捕まってしまいました。 – FishBasketGordo