なかだです。

At Thu, 7 Mar 2002 14:08:05 +0900,
K.Kosako <kosako / sofnec.co.jp> wrote:
> > よく調べてないのですが、逆方向に探すのではなくてlookbehindのア
> > ンカーを終端として先頭からマッチさせる、というのではうまく行か
> > ないでしょうか。これならExact match以外のパターンも使えそうな気
> > がするのですが。
> > 
> > たとえば/(?=[a-z]+):/なら、/[a-z]+\z/ =~ str[0...(/:/ =~ str)]
> > みたいな感じ。内部的には\zとは別の表現が必要でしょうが。
> 
> 面白いアイディアなので少し考えてみました。
> 
> まず条件として、後ろ読みパターン"(?<=), (?<!)" は、全体のパターンの
> 先頭にのみ存在することが必要です。
> (このこと自体は自明なことなのか、そうでもない使用方法があるのか、
> Perlではlook-behindをどこにでも書けるのか、私にはわかりません。)

書けるようです。
$ perl -e 'print "zzzaaabbb" =~ /a+(?<=zaaa)b+/'
1

が、やっぱり固定パターン以外は書けないという制限がありました。
Perl、お前もか。

$ perl -e 'print "zzzaaabbb" =~ /a+(?<=z.*)b+/'
/a+(?<=z.*)b+/: variable length lookbehind not implemented at -e line 1.

> (?<=...)の直後に、本当のマッチング開始位置を変数にセットするための
> 命令コード(新規)を追加すれば、可変長のパターンも扱えるような気がします。
> しかし問題なのは、RegexSearch(),RegexMatch()で、マッチングの開始位置を
> 文字列の左端ではなくオフセット位置で指定されたときです。
> 後ろ読みパターンが無限長なら、オフセットの値に関係なく、文字列の先頭から
> マッチングしなければならなくなります。

Perlではオフセットよりも前までマッチするようです。

$ perl -e 'print join(",","a:a:b"=~m/(?<=a:)\w/g),"\n"'
a,b

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦