From: ABE Yasushi (=?ISO-2022-JP?B?GyRCMCRJdBsoQiAbJEJMdztKGyhC?=) Date: 2000-11-26T14:58:31+09:00 Subject: [ruby-list:26175] Re: エスケープされていない "," で文字列分割 ? 阿部です。 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"]