作者: Bruce.
日時: 2006/10/26(00:32)
Bruce.です。

jperlはインストールしていないし、ソース(or/and パッチ)を
見る気もないので以下は推測で書いています。

Bunta さんは書きました (2006/10/23 23:20):
>  意味のない例ですが、look-behindもいけますね。(^^)v
> 
>> jperl -pe "s/(?<=あ)いうえお/かきくけこ/;" test.txt
> あいうえお              #test.txt
> いいうえお
> 
> あかきくけこ            #output
> いいうえお
> 
>> jperl -pe "s/(?<!あ)いうえお/かきくけこ/;" test.txt
> あいうえお              #test.txt
> いいうえお
> 
> あいうえお              #output
> いかきくけこ
(snip)
>  すると、鈴木さんのあれはますます謎ですね。で、何が駄目なんだっけ?(^^;
>  コメントとかのあのシリーズと…。

perlのlook-behindはその仕様上固定長である必要があります
(ぢつは抜け道がないわけでもない)。したがって、ShiftJISの
ようなマルチバイト文字エンコーディングの場合、たとえば
'.' が表す一文字が1バイトである可能性も2バイトである可能性
もともにあります。このため、latin-1(通常のPerlが使用するで
あろうと仮定されているエンコーディング)とは異なり、'.'が
可変長になってしまうのでlook-behindで使うことができません。

文太さんの例でうまく行ったように見えたのは、単にバイト列
として戻り読みをしても問題がなかったからです。

たとえば (?<=@)\d+ という正規表現があったとき、
@が先行する数字列にマッチすることが期待されますが、
ShiftJISの場合2バイト目に@と同じ文字コード(0x40)を
含む文字が存在します。これらの文字に対してもバイト列
として眺めてしまうのでマッチが成功してしまう可能性が
あります。

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk@...
	web  www.kt.rim.or.jp/~kbk/index.html#zakkicho
	     homepage3.nifty.com/farstar/