正規表現の最短マッチングにおける"?"についての瑣末な話
最短マッチ
私は正規表現について簡単な用途では使える気でいたのですが,あるとき次のような正規表現に出会いました.
.*?
.*
は任意の文字が0個以上,というのはわかるのですが,そのあとの?
がわからない.
もちろんこの正体は,ご存知の方は多いでしょうが「最短マッチ」というものです.
私はこれに出会うのは初めてだったので,なるほど…と思ったのですが,これを見た時に色々考えてしまいました.
「?は0個か1個かを表す意味のメタ文字であるはず」
「ということは .*
が0個か1個かを探しているのか?」
「いや,でもどう考えてもそれじゃ最短マッチにならない…」
結局考えると「?
によって最短マッチとなるのは?
の機能を活用したものなのか,それとも単に?
に最短マッチとなる効果があるのか」という疑問にまとまり調査した結果,後者らしいということがわかりました.
Regex Tutorial - Repetition with Star and Plus曰く,「repititionオペレータはgreedyであるが,?
をつけるとlazyにできる」とあったのでこれで結論みたいです.
他のサイトでもメタ文字一覧の?
にも同じことが書かれていたりしました.
おまけ
?
という0個か1個というrepititionにも?
が使えるらしいので試して見ました.
文字列"ab"に対して
ab?
->ab
にマッチab??
->a
にのみマッチ
ちゃんと動作しているようです.使い所あるのか…?