JavaScript - 正規表現のmatchとexec


matchとexecは、グローバルオプション「g」が無い場合には同じ結果を返します。しかしグローバルオプション「g」がある場合には、それぞれ異なる結果を返します。

グローバルオプション「g」がある場合には、
matchは文字列のすべてを検索しすべてのマッチを配列で返します。execはlastIndex以降の「最初のマッチのみ」を返します。またexecを実行するたびにlastIndexの値を書き換えます。


matchはmatchを1回実行し、結果オブジェクトを繰り返し処理をするという使い方をします。
var reg = /(\d{6})/g;
var str = "123123444456789789456";
var results = str.match(reg);
for (var i = 0; results.length > i; i++) {
	alert(results[i]);
}

実行結果
123123
444456
789789


execはexecを繰り返し実行しながら、同時に結果オブジェクトを処理するという使い方をします。
var reg = /(\d{6})/g;
var str = "123123444456789789456";
var result;
while (result = reg.exec(str)) {
	alert(RegExp.lastMatch);
}

実行結果
123123
444456
789789


文字列を全量処理する場合にはmatchのほうが若干高速になります。
しかし例えば「3つ目のマッチでのみ処理を行なう」など、文字列の途中までしか処理しない場合にはexecを使うといいでしょう。


また、次のようなケースではexecが有効になります。
「123123444456789789456」という文字列の中から数字が6文字並ぶすべてのパターンを抽出する場合。
var reg = /(\d{6})/g;
var str = "123123444456789789456";
var result;
while (result = reg.exec(str)) {
	alert(RegExp.lastMatch);
	reg.lastIndex -= 5;
}

実行結果
123123
231234
312344
123444
234444
344445
444456
444567
445678
456789
567897
678978
789789
897894
978945
789456