Terrarium

いわゆる掃き溜めの ありふれた有象無象

正規表現の最短マッチングにおける"?"についての瑣末な話

最短マッチ

私は正規表現について簡単な用途では使える気でいたのですが,あるとき次のような正規表現に出会いました.

.*?

.*は任意の文字が0個以上,というのはわかるのですが,そのあとの?がわからない. もちろんこの正体は,ご存知の方は多いでしょうが「最短マッチ」というものです.

私はこれに出会うのは初めてだったので,なるほど…と思ったのですが,これを見た時に色々考えてしまいました.

「?は0個か1個かを表す意味のメタ文字であるはず」

「ということは .* が0個か1個かを探しているのか?」

「いや,でもどう考えてもそれじゃ最短マッチにならない…」

結局考えると「?によって最短マッチとなるのは?の機能を活用したものなのか,それとも単に?に最短マッチとなる効果があるのか」という疑問にまとまり調査した結果,後者らしいということがわかりました.

Regex Tutorial - Repetition with Star and Plus曰く,「repititionオペレータはgreedyであるが,?をつけるとlazyにできる」とあったのでこれで結論みたいです. 他のサイトでもメタ文字一覧の?にも同じことが書かれていたりしました.

おまけ

?という0個か1個というrepititionにも?が使えるらしいので試して見ました.

regex-testdrive.com

文字列"ab"に対して

  • ab? -> abにマッチ
  • ab?? -> aにのみマッチ

ちゃんと動作しているようです.使い所あるのか…?