0

重複の可能性:
Javascriptでグローバルフラグを指定したRegExpが間違った結果をもたらすのはなぜですか?

私のコードは次のとおりです、

HTML:

<p id="test"></p>​

JavaScript:

var patt = /h/gi;
var arr = ["", "2Hour", "4Hour", "8Hour", "Next Business Day"];
var test = document.getElementById("test");

for (var i = 0; i < arr.length; i++)
{
    if (patt.test(arr[i])) {
        test.innerHTML += " " + arr[i];
    }
}

ただし、取得する出力は2Hour 8Hour、なぜ4Hourは出力の一部ではないのですか?

正規表現に何か問題がありますか?どうすればこの問題を解決できますか?

私はそれをフィドルに載せました

</ p>

4

1 に答える 1

5

MDNを引用するには:

exec(またはそれと組み合わせて)と同様に、同じグローバル正規表現インスタンスで複数回呼び出されたテストは、前の一致を超えて進みます。

現在起こっていることは次のとおりです。

  1. に格納されている正規表現はpatt、2番目の文字列をテストし、インデックスで一致するものを見つけて、1この情報を保持します。
  2. 次に使用するときは、インデックス以降testで一致を見つけようとしますが、文字列を効果的にテストしているため、明らかに一致しません。1 "our"
  3. これにより、ポインタがにリセットさ0れ、インデックスの次の文字列で一致1するものを見つけることができます。

したがって、問題を解決するには、反復ごとに新しいインスタンスを作成するだけです。

for (var i = 0; i < arr.length; i++)
{
    if (/h/gi.test(arr[i])) {
        test.innerHTML += " " + arr[i];
    }
}

これにより、「ポインタがクリア」され、正規表現がテスト対象の各文字列に対して同じように動作することが保証されます。

これがデモンストレーションです:http://jsfiddle.net/QbXEX/12/

于 2012-12-06T10:56:13.103 に答える