は、このコードを考える:私はこれが起こる可能性がどのよう見当がつかないtest()が2回呼び出されたときに "g"修飾子が異なる結果をもたらすのはなぜですか?
true
false
:
var reg = /a/g;
console.log(reg.test("a"));
console.log(reg.test("a"));
私はこの結果を得ます。私はNode.js(v8)とFirefoxブラウザの両方でテストしました。
は、このコードを考える:私はこれが起こる可能性がどのよう見当がつかないtest()が2回呼び出されたときに "g"修飾子が異なる結果をもたらすのはなぜですか?
true
false
:
var reg = /a/g;
console.log(reg.test("a"));
console.log(reg.test("a"));
私はこの結果を得ます。私はNode.js(v8)とFirefoxブラウザの両方でテストしました。
問題を回避するには、g
フラグを削除したり、同じ文字列を渡された場合test
が最初にした後、よりマッチを探しexec
の周りに基づいているため、問題が発生しlastIndex
var reg = /a/g;
console.log(reg.test("a"));
reg.lastIndex = 0;
console.log(reg.test("a"));
のようにリセットすることができますg
フラグが存在します。
15.10.6.3
RegExp.prototype.test(string)
#ⓉⓇ以下のステップがとられる:
- は一致はを使用して、この
RegExp
オブジェクト際RegExp.prototype.exec
(15.10.6.2)アルゴリズムを評価した結果とします文字列を引数として使用します。- と一致する場合、は
null
ではないため、true
を返します。それ以外の場合はfalse
を返します。
exec
の重要な部分は、15.10.6.2のステップ6:
6.グローバルは、引数 "グローバル" とRの[[取得]]内部メソッドを呼び出した結果とします。
7.グローバルがfalseの場合、i
が0にリセットされていない場合は、その後、その後exec
(したがってtest
)、私は= 0
聞かせすることは、文字列の先頭を見て開始されません。
あなたは各試合を処理するためにループすることができますので、これはexec
に便利です:
var myRegex = /o/g;
var myString = "fooo";
for (var match; match = myRegex.exec(myString);) {
alert(match + " at " + myRegex.lastIndex);
}
が、明らかにそれはtest
のためにそれほど有用ではないですが。
通常、パターンは一致するパターンがあるかどうかを確認するために選択されますが、グローバルフラグを使用すると文字列をループして一致をカウントするか、execのように各lastIndexで何かを行います。別の使用法は、テストが実行される前にrxのlastIndexを設定して、ある文字インデックスの前に一致を無視することです。
var count=0, rx=/\s+/g, rx.lastIndex=100;
while(rx.test(string))count++;
つまり、lastIndexを0に設定する必要があります。 – NStal
+1良い説明、私はそれを知らなかった。 –
@NStal、はい、テストの前に 'lastIndex'を0に設定すると、問題を回避できます。 –