2012-01-18 4 views

答えて

24

問題を回避するには、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.3RegExp.prototype.test(string)#ⓉⓇ

以下のステップがとられる:

  1. 一致を使用して、このRegExpオブジェクト際RegExp.prototype.exec(15.10.6.2)アルゴリズムを評価した結果とします文字列を引数として使用します。
  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のためにそれほど有用ではないですが。

+0

つまり、lastIndexを0に設定する必要があります。 – NStal

+0

+1良い説明、私はそれを知らなかった。 –

+0

@NStal、はい、テストの前に 'lastIndex'を0に設定すると、問題を回避できます。 –

2

通常、パターンは一致するパターンがあるかどうかを確認するために選択されますが、グローバルフラグを使用すると文字列をループして一致をカウントするか、execのように各lastIndexで何かを行います。別の使用法は、テストが実行される前にrxのlastIndexを設定して、ある文字インデックスの前に一致を無視することです。

var count=0, rx=/\s+/g, rx.lastIndex=100; 
while(rx.test(string))count++; 
関連する問題