From: nobu.nakada@... Date: 2002-03-07T14:46:28+09:00 Subject: [ruby-dev:16248] Re: [Oni Guruma] look behind なかだです。 At Thu, 7 Mar 2002 14:08:05 +0900, K.Kosako 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はできる。 中田 伸悦