正規表現における最短一致と最長一致

広告

正規表現で繰り返しを表現するメタ文字を使用する場合、デフォルトでは一番長い文字列とマッチしようとします。これを最長一致と呼びます。逆に一番短い文字列とマッチすることを最短一致と呼びます。ここでは正規表現における最短一致と最長一致について解説します。

最短一致と最長一致

アスタリスク(*)、プラス(+)など直前の文字を繰り返すメタ文字を使用する場合に注意しなければいけないのは、対象の文字列のどの部分にマッチするかを気にしなければいけない場合です。明示的に指定しない場合はできるだけたくさんの文字とマッチしようとします。

例えば "Happy day" という文字列を対象に次のような正規表現のパターンでマッチさせた場合で考えてみます。

a.+y

"a" 、 任意の文字が 1 回以上続く文字、 "y" 、と続くパターンとなります。対象の文字列が "Happy day" だった場合、このパターンにマッチするのは次の二通りがあります。

Happy day

Happy day

前者のように一番短くマッチする場合を最短一致、後者のように一番長くマッチする場合を最長一致といいますが、デフォルトでは最長一致でマッチします。

最長一致ではなく最短一致でマッチさせたい場合には、繰り返しで使用するメタ文字の最後に "?" を付けた次のメタ文字を使用します。

*?
+?
??
{num, num}?

それでは、 "a" 、 任意の文字が 1 回以上続く文字、 "y" 、と続くパターンで最短一致でマッチさせたい場合は次のように記述します。

a.+?y

対象の文字列が "Happy day" だった場合、このパターンに次に部分がマッチします。

Happy day

-- --

正規表現における最短一致と最長一致について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。