極悪です。
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?