前田@リコーです。

前田> 強いて言えば「くり返し優先」「スキップ優先」ですかね。

これだけだといじわるみたいなので、例で説明しましょう。

abc.+def、abc.+?defという表現に対してabc12de34def56defという文字
列を与えた場合を考えます。たくさんあるマッチの可能性全部を一度に
調べることはできないので、未探索の可能性をスタックにためながら、
バックトラックによって調べていきます。最初に一致が見つかったとこ
ろで、答として返します。このときスタックに入ってるものは捨てられ
ます。

---

★abc.+defの場合

一致済				試行	失敗したら		結果
				a ? a	開始位置を進める	ok
a	 a			b ? b	開始位置を進める	ok
ab	 ab			c ? c	開始位置を進める	ok
abc	 abc			. ? 1	開始位置を進める	ok
abc.	 abc1			. ? 2	1: dから試す		ok
abc.+	 abc12			. ? d	2: dから試す		ok
abc.+	 abc12d			. ? e	3: dから試す		ok
	   中略	    
abc.+	 abc12de34def56		. ? d	11: dから試す		ok
	   中略
abc.+	 abc12de34def56de	. ? f	13: dから試す		ok
abc.+	 abc12de34def56def	. ? 終	14: dから試す		ng -> 14へBT
abc.+	 abc12de34def56def	d ? 終	バックトラック		ng -> 13へBT
abc.+	 abc12de34def56de	d ? f	バックトラック		ng -> 12へBT
abc.+	 abc12de34def56d	d ? e	バックトラック		ng -> 11へBT
abc.+	 abc12de34def56		d ? d	バックトラック		ok
abc.+d	 abc12de34def56d	e ? e	バックトラック		ok
abc.+de	 abc12de34def56de	f ? f	バックトラック		ok
abc.+def abc12de34def56def	終 ? 終	バックトラック		ok -> 終了

★abc.+?defの場合

一致済			試行	失敗したら		結果
			a ? a	開始位置を進める	ok
a	 a		b ? b	開始位置を進める	ok
ab	 ab		c ? c	開始位置を進める	ok
abc	 abc		. ? 1	開始位置を進める	ok
abc.	 abc1		d ? 2	1: .のくり返しを試す	ng -> 1へBT
abc.+	 abc1		. ? 2	開始位置を進める	ok
abc.+	 abc12		d ? d	1: .のくり返しを試す	ok
abc.+d	 abc12d		e ? e	バックトラック		ok
abc.+de	 abc12de	f ? 3	バックトラック		ng -> 1へBT
abc.+	 abc12		. ? d	開始位置を進める	ok
abc.+	 abc12d		d ? e	1: .のくり返しを試す	ng -> 1へBT
abc.+	 abc12d		. ? e	開始位置を進める	ok
	 中略
abc.+	 abc12de34	d ? d	開始位置を進める	ok
abc.+d	 abc12de34d	e ? e	開始位置を進める	ok
abc.+de	 abc12de34de	f ? f	開始位置を進める	ok
abc.+def abc12de34def	終 ? 終	開始位置を進める	ok -> 終了

結果として、
	abc.+def	abc12de34def56def
	abc.+?def	abc12de34def
が得られますが、長さに関する計算は一度も行っていないことがわかり
ます。

ここで、頭のいい人は「そうか、長さが最長、ではなくてくり返し回数
が最大なんだな」とか思うかもしれませんが、実はそれも正確ではあり
ません。「ある順番で試し、最初に見つかったもの」という大原則があっ
て、+に対する?ではその「順番」をコントロールしているにすぎません。

-------------------------------  Vulture       LRM20   .□||□.   LRM20
 前田 薫 maeda / src.ricoh.co.jp   75t 175km/h     Md+  o'□||□`o  Md+
 (株)リコー ソフトウェア研究所   HeatSink 18  LG Sm+   .=X~~X=.   Sm+ LG
-------------------------------  Armor 2195           _|_    _|_