原です。 |前田@リコーです。 |そのココロは、 | + greedy 次の正規表現より、くり返しを優先して試す | +? non-greedy 次の正規表現を、くり返しより優先して試す |という違いです。 なるほど、これは分かりやすい説明ですね。 |最長/最短という言葉の印象からくる「長さ」とかその「影響範囲」と |かいう考え方は忘れましょう。 ううむ、そこまで言わなくてもいいんじゃないですか?(^^;) 例えば、 正規表現が ? を伴わない繰り返し指定のみで書かれた場合、つまり ruby1.0 的、perl4 的な正規表現である場合、[ruby-list:10658] で 説明されたバックトラックによって得られたマッチは、長さの計算は 無くても結局「再左最長」つまり「最左で最長、最左優先」になって ますよね。 #反例あるかな?ただし |(選択)が入ると話は別だけど。 同様に ? を伴う繰り返し指定のみで書かれた正規表現では、「最左最 短」と言ってもいいような気がします。ちょー簡単な例では "abc" =~ /(.+?)c/ # $& => abc, $1 => ab という意味で「最左」であり、 "abc" =~ /a(.+?)/ # $& => ab, $1 => b という意味で「最短」と言える。 で、+ と +? が交じっていたりするとややこしいんだけど、まあ 「マッチの開始位置はマッチする範囲で常に最も左になるものが選 ばれる。」「? がついていてもいなくてもマッチの真偽には、影響 がない。」とここまでは言える。 そして(ある正規表現を取り出してただ「最長」、「最短」というの は語弊が多いのだけど)「この .+? が最短というのはどういうこと?」 と問われれば、一応、「その部分にマッチする文字列が最短になるよ うに」と答えるのは正しいのではないかな。 もちろん、正規表現が複雑になると「ある条件下で最短」とか言わな いといけなくて、どんな条件?とさらに突っ込まれたら、やはり前田 さんのように説明せざるを得ないと思いますが。 #昔の Try!PC に「最左最長」と書いてしまった手前、自己弁護。^^;