作者: dune
日時: 2004/1/04(22:54)
極悪です。

Ueta Masayuki さんの [TSfree:595] non-greedy pattern matching から
>つぎに、位置指定子$を付けると、最後にある'(quiz)'
>だけに一致すると思っていたところ、実際には'(test).
>This is a (quiz)'に一致しまいました。

えー、僕は正規表現内部の詳しいメカニズムは分かってないので、
違ってたらなおしてください。



$ は文字列末尾にマッチしますが、パターンを最後(最右)から探
し始めろ、という指示にはなりませんから。

(1) 着目点を文字列の左端にセット
                ↓
(2) \( が見つかるまで着目点を一字ずつ右側にずらしていく
                ↓
                ↓見つかった場所を A 点とする
                ↓
(3) 右カッコ+文字列末尾 \)$ にマッチするまで着目点を一字ず
    つ右側にずらしていく
                ↓
                ↓(最初に)見つかった場所を B 点とする
                ↓
(4) A 点から B 点までが答え

最短一致と最長一致の違いは、(3) のフェーズを最初のマッチで抜
けるか最後のマッチで抜けるかだと思います。

文字列    'That is a (test). This is a (quiz)';
着目点               A                       B
正規表現 m/         \(.+?                  \)$/x



最後の (quiz) にマッチさせたかったら、最初の (test) の左カッ
コのマッチを失敗させて、次の左カッコを探させる必要があります。

(1) 着目点を文字列の左端にセット
                ↓
(2) 左カッコ \( が見つかるまで着目点を一字ずつ右側にずらして
    いく        ↓
                ↓見つかった場所を A 点とする
                ↓
(3) 右カッコ+文字列末尾 \)$ にマッチするまで着目点を一字ず
    つ右側にずらしていく。ただし再度 \( に出会ったら (2) に
    戻る。      ↓
                ↓見つかった場所を B 点とする
                ↓
(4) A 点から B 点までが答え

文字列    'That is a (test). This is a (quiz)';
着目点               A→失敗           A     B
正規表現 m/                         \([^(]+\)$/x



#なんかすごく効率悪いですね。間違ってるかな。
-- 
FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?