mugaxのなんでも情報局

いろんな分野について発信していきます。

正規表現の最長一致と最短一致 in JavaScript

正規表現を利用するのは便利だ。特に、JavaScriptでは正規表現が簡単に使えるので、利用しない手はない。ただし、最長一致と最短一致について理解していないと、思い通りの結果が得られない。だから、最長一致と最短一致について理解しておくことは非常に重要だ。

  • 最長一致というのは、できるだけ長い文字列に一致させるというルールである。
  • 最短一致というのは、できるだけ短い文字列に一致させるというルールである。

今回は、"<html><body><h1>Message</h1><p>abcdefg</p></body></html>"
という文字列から"<"と">"で囲まれた部分を取り出す場合で考える。

まずは、最長一致で取り出すコード


let re = /<.*>/g;
let str = "<html><body><h1>Message</h1><p>abcdefg</p></body></html>"
let arr = str.match(re);
for(let v of arr){
    console.log(v);
}

結果:
<html><body><h1>Message</h1><p>abcdefg</p></body></html>

 

次に、最短一致で取り出すコード


let re = /<.*?>/g;
let str = "<html><body><h1>Message</h1><p>abcdefg</p></body></html>"
let arr = str.match(re);
for(let v of arr){
    console.log(v);
}

結果:
<html>
<body>
<h1>
</h1>
<p>
</p>
</body>
</html>

何が異なるかというと、最短一致にしたい場合は、量指定子の直後に「?」を置いている。 たったこれだけであるが、知らなかったり失念していたりすると原因究明にかなりの時間を割く羽目になってしまうだろう。

ちなみに、Gオプションなしにすると、最初にマッチした時点で終了してしまう。これも、ミスしやすいので気をつけておいた方がいいだろう。

Gオプションなし


let re = /<.*?>/;
let str = "<html><body><h1>Message</h1><p>abcdefg</p></body></html>"
let arr = str.match(re);
for(let v of arr){
    console.log(v);
}

結果:
<html>