regexp.exec(string)において、gフラグがセットされていた場合、検索が文字列の先頭から行われるのではなくregexp.lastIndexプロパティの場所から行われるようになる(この値は最初は0にセットされている)。もしマッチが成功した場合、regexp.lastIndexはマッチした場所の次の文字の場所にセットされる。もしマッチが失敗した場合は0にリセットされる。
これを利用すれば、ループの中でexecを同じ文字列に対して何度も呼び出すことで、文字列中に複数存在するパターンをすべて探し出すことができる。
string.match(regexp)において、gフラグがセットされていた場合、このメソッドはすべてのマッチ結果を配列で返すが、キャプチャグループによるキャプチャ結果は取得できなくなる。
var text = '<html><body bgcolor=linen><p>This is <b>bold<\/b>!<\/p><\/body><\/html>';
var regexp = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
console.log("regexp.lastIndex = " + regexp.lastIndex);
while ((a = regexp.exec(text))) {
console.log("regexp.lastIndex = " + regexp.lastIndex);
for (i = 0; i < a.length; i += 1) {
console.log(('[' + i + '] ' + a[i]));
}
console.log(" ");
}
console.log("-----");
a = text.match(regexp);
for (i = 0; i < a.length; i += 1) {
console.log(('[' + i + '] ' + a[i]));
}
/*
regexp.lastIndex = 0
regexp.lastIndex = 6
[0] <html>
[1]
[2] html
[3]
regexp.lastIndex = 26
[0] <body bgcolor=linen>
[1]
[2] body
[3] bgcolor=linen
regexp.lastIndex = 29
[0] <p>
[1]
[2] p
[3]
regexp.lastIndex = 37
[0] This is
[1] undefined
[2] undefined
[3] undefined
regexp.lastIndex = 40
[0] <b>
[1]
[2] b
[3]
regexp.lastIndex = 44
[0] bold
[1] undefined
[2] undefined
[3] undefined
regexp.lastIndex = 48
[0] </b>
[1] /
[2] b
[3]
regexp.lastIndex = 49
[0] !
[1] undefined
[2] undefined
[3] undefined
regexp.lastIndex = 53
[0] </p>
[1] /
[2] p
[3]
regexp.lastIndex = 60
[0] </body>
[1] /
[2] body
[3]
regexp.lastIndex = 67
[0] </html>
[1] /
[2] html
[3]
-----
[0] <html>
[1] <body bgcolor=linen>
[2] <p>
[3] This is
[4] <b>
[5] bold
[6] </b>
[7] !
[8] </p>
[9] </body>
[10] </html>
*/
JavaScript:the good parts 「良いパーツ」によるベストプラクティス [ ダグラス・クロフォード ] ExternalLink P99~100、103