2017-05-07 12 views
2

私のコードの面白い問題が見つかりました。 Hereは私のコードの簡略化されたバージョンです。 regex.testを呼び出すと、そのたびに出力値が変更されます。あなたはdevtoolsで 'select on evaluation'を使ってそのことを試みることができ、異なる値が表示されます。RegExp.test(JavaScript)のバグ

答えて

4

Regexpで/gを使用していますが、これが使用され、正規表現が複数回実行されると、前回終了した箇所から常に始まります。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex

このプロパティは、正規表現のインスタンスは、グローバル検索を指示するために「G」フラグを使用する場合にのみ設定されています。次の規則が適用されます

lastIndexのは、文字列、テスト()とexec()失敗の長さより大きい場合、lastIndexのが設定されているlastIndexの文字列の長さに等しい場合

0に正規表現が空の文字列と一致する場合、正規表現はlastIndexから始まる入力と一致します。

lastIndexの文字列の長さに等しく、正規表現が空の文字列は、正規表現の不一致入力を、一致しないとlastIndexのは、そうでなければ0

にリセットされる場合、lastIndexのがに設定されている場合直近の試合の次の順位。

あなたのループでconsole.log(regex.lastIndex)をすることによってこれを確認することができます

for (var a = 0; a < 10; a++) { 
    console.log(regex.lastIndex) 
    if (!regex.test(inner)) { 
     log.innerHTML += "true"; 
    } 
    else { 
     log.innerHTML += "false"; 
    } 

    log.innerHTML += " "; 
} 

をそして、あなたはそれが18で開始したとき、それは、それが一致して、0から始まるとき、それは、だから、0 18の間に交互に表示されますそれは一致しません。

+0

ありがとう – Herrgott