阿部です。

At Sun, 26 Nov 2000 07:11:00 +0900,
MOROHOSHI Akihiko wrote:
> /((?:[^\\\,]|\\.)*)(?:\,)?/
> とかでscanするというアプローチはどうでしょう。

詳説 正規表現からパクってruby風にアレンジしたのですが

  param=l.scan(/"([^"\\]*(?:\\.[^"\\]*)*)",? # double quoteで囲まれた項目
                |([^,]+),?                   # quoteが無い通常の項目
                |,                           # 空項目
                /x).collect{|i,j|  i ? i : j}
というのを使ってました。

が、これだと\でエスケープというのは考慮されていないようなので
(エスケープは""で行う)

正規表現を師星さんがやっていたように
/"([^"\\]*(?:\\.[^"\\]*)*)",?|((?:[^\\,]|\\.)+),?|,/
                              ~~~~~~~~~~~~~~~~~~~~
とするか、あるいは
/"([^"\\]*(?:\\.[^"\\]*)*)",?|([^,][^,\\]*(?:\\.[^,\\]*)*),?|,/
(前半と同様に)このようにするとよさそうです

結果は同じになると思います。

> このパターンだと末尾に","が一つあるときとないときの区別がつかないので、
> 場合によっては使えませんけど。
> p "aaa,bbb,ccc,dd\\,d\\\\,d,,e".scan /((?:[^\\\,]|\\.)*)(?:\,)?/
> # => [["aaa"], ["bbb"], ["ccc"], ["dd\\,d\\\\"], ["d"], [""], ["e"], [""]]
# => ["aaa", "bbb", "ccc", "dd\\,d\\\\", "d", nil, "e"]

> p "aaa,bbb,ccc,dd\\,d\\\\,d,,e,".scan /((?:[^\\\,]|\\.)*)(?:\,)?/
> # => [["aaa"], ["bbb"], ["ccc"], ["dd\\,d\\\\"], ["d"], [""], ["e"], [""]]
# => ["aaa", "bbb", "ccc", "dd\\,d\\\\", "d", nil, "e"]