まつもと ゆきひろです

In message "[ruby-list:18311] Re: [book] csv_split2"
    on 99/11/03, Koretsugu Daigoro <tmmcross / hk.airnet.ne.jp> writes:

|しかしですね、
|
|#!/usr/local/bin/perl
|$source = ',"z","b",b,';
|@csv = ();
|push(@csv, $+) while $source =~ m/(?:^|,)(?:"((?:[^"]|"")*)"|([^,]*))/g;
|print(join(":", @csv));
|
|:z:b:b:
|
|となるのです。
|
|正規表現は Perl 互換だと思っていいのですよね?

そのつもりでいます。なかなか追い付けないのですが。

|だとしたら Ruby の正規表現のバグかしら?

というか、String#scanとm//gの挙動の違いが原因のようです。
scanの方は空パターンにマッチすると、無限ループになることを避
けるために、1文字分ポインタを移動させます。ですから、次のマッ
チは先頭からではなく、「"z"」の先頭に対して行われ、結果とし
て(マッチしない)"z"の部分は無視されます。

ところがPerlの方ではどういうわけかポインタは進まず、より長い
マッチが選択されるようです。この動作原理は良く分かりませんが、
このルールが明確にできればRubyの方でも合わせることはできると
思います。どういうルールなんだろう? m//gが正規表現と一体化
しているがゆえにできることなんだろうか?

                                まつもと ゆきひろ /:|)