JavaScript: 正規表現での「最長一致」と「最短一致」の違い

JavaScritpで正規表現を使って文字列を取得する場合、 「最長一致(最長マッチ)」と「最短一致(最短マッチ)」の違いを知っている必要があります。

  • 最長一致: できるだけ長い文字列を一致させる
  • 最短一致: できるだけ短い文字列を一致させる

正規表現の書き方は次の通りです。

  • 最長一致:「.*」や「.+」
  • 最短一致:「.*?」や「.+?」

「?」があるかないかが違いです。

具体例を見た方が分かりやすいので早速サンプルコードを紹介します。

最長一致

リストの中の li タグを最長一致で取得するコードです。


var str = "<ul><li>a</li><li>b</li><li>c</li></ul>";

// 正規表現 最長一致
var ex = /<li>.*<\/li>/g;

var arr = str.match(ex);

for (var i = 0, len = arr.length; i < len; i++){
	console.log(i);
    console.log(arr[i]);
}

実行結果

0
<li>a</li><li>b</li><li>c</li>

これが最長一致のケースです。 できるだけ長い文字列を一致させますから、 最初の<li>から最後の</li>までを取得します。 その結果ループは1回しか回りません。

最短一致

リストの中の li タグを最短一致で取得するコードです。
最短一致の場合は「.*?」というように「?」を付けます。


var str = "<ul><li>a</li><li>b</li><li>c</li></ul>";

// 正規表現
var ex = /<li>.*?<\/li>/g;

var arr = str.match(ex);

for (var i = 0, len = arr.length; i < len; i++){
	console.log(i);
    console.log(arr[i]);
}

実行結果

0
<li>a</li>
1
<li>b</li>
2
<li>c</li>

最短一致なので、できるだけ短い文字列を一致させます。 その結果、li タグを3回に分けて取得できます。

JavaScript入門