5

特定のグループを文字列でキャプチャするための簡単なコードを作成しました。

/[a-z]+([0-9]+)[a-z]+/gi    (n chars , m digts , k chars).

コード:

var myString='aaa111bbb222ccc333ddd';
var myRegexp=/[a-z]+([0-9]+)[a-z]+/gi;

var match=myRegexp.exec(myString);
console.log(match)
 
 while (match != null)
{
  match = myRegexp.exec(myString);
  console.log(match)
}

結果は次のとおりです。

["aaa111bbb", "111"]
["ccc333ddd", "333"]
null

bbb222cccしかし、ちょっと待ってください、なぜ彼はその部分を試さなかったのですか?

つまり、それは見ましたaaa111bbbが、それなら彼は試してみるべきでしたbbb222ccc...(それは貪欲です!)

私は何が欠けていますか?

また

見つめている

   while (match != null)
    {
      match = myRegexp.exec(myString);
      console.log(match)
    }

2番目の結果までどのように進みましたか? 最初はありました:

var match=myRegexp.exec(myString);

後で (while ループで)

match=myRegexp.exec(myString);
match=myRegexp.exec(myString);

それは同じ行です...最初の結果がすでに表示されていることをどこで覚えていますか?

4

2 に答える 2

4

.execgフラグを使用するとステートフルになります。状態は正規表現オブジェクトの.lastIndexプロパティに保持されます。

var myString = 'aaa111bbb222ccc333ddd';
var myRegexp = /[a-z]+([0-9]+)[a-z]+/gi;
var match = myRegexp.exec(myString);
console.log(myRegexp.lastIndex); //9, so the next `.exec` will only look after index 9
while (match != null) {
    match = myRegexp.exec(myString);
    console.log(myRegexp.lastIndex);
}

状態は、別の文字列に設定.lastIndexする0execing、別の文字列でリセットできます。re.exec("")たとえば、状態が保持されていたため、状態がリセットされ'aaa111bbb222ccc333ddd'ます。

.test同じことがメソッドにも当てはまるので、驚きを望まない場合にg使用される正規表現でフラグを使用しないでください。https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec.testを参照してください

于 2012-11-30T14:52:19.690 に答える
2

プロパティを手動で更新することもできlastIndexます:

var myString='aaa111bbb222ccc333ddd';
var myRegexp=/[a-z]+([0-9]+)[a-z]+/gi;

var match=myRegexp.exec(myString);
console.log(match);

 while (match != null)
{
  myRegexp.lastIndex -= match[0].length - 1; // Set the cursor to the position just after the beginning of the previous match
  match = myRegexp.exec(myString);
  console.log(match)
}

このリンクMDN execを参照してください。


編集 :

ところで、正規表現は次のようになります。/[a-z]{3}([0-9]{3})[a-z]{3}/gi

于 2012-11-30T14:54:45.713 に答える