【JavaScript】string.match(regexp)とregexp.exec(string)で正規表現にgフラグがセットされていた場合

  • このエントリーをはてなブックマークに追加

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

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*