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/