質問: 6,0000(円) (税込、送料込) 獲得ポイント660 ********************************************************************* 小計 18,0000(円) 送料 0(円) 離島・一部地域では別途料金が必要な場合があります --------------------------------------------------- 合計 18,0000(円) --------------------------------------------------------------------- 今回のお買い物で獲得するポイント 660 --------------------------------------------------------------------- *消費税について 消費税率 8% 消費税計算順序 1商品毎に消費税計算 1円未満消費税端数 切り捨て --------------------------------------------------------------------- (省略) ``` 質問 -- 正規表現では複数行や、ここ〜ここまでといった指定方法が難しいかと思います。 正規表現以外の方法でかんたんに取得する方法はないでしょうか? ### 備考 使用言語 Ruby メールの容量は5,6KBぐらいの量になります。 送信者側のフォーマットは決まっておりますので、受信者側で解析、変換したいと考えております。
回答: ``` #encoding : utf-8 mail = open("メールテスト.txt", &:read).encode("UTF-8").scan(%r|商品名(.+)\nサイズ(.+)\nカラー(.+)\n※オプション:(.+)\n価格(.+)\n|) mail = mail.transpose item = mail[0] size = mail[1] color = mail[2] num = mail[4] mail.clear item.map!{|e| e.gsub(/\(|\)/, "")} size.map!{|e| e.gsub(":", "")} color.map!{|e| e.gsub(":", "")} num.map!{|e| e.scan(%r|\d+?\(個\)|).map{|ee| ee.gsub("(個)", "")}}.flatten! mail << item mail << size mail << color mail << num mail = mail.transpose mail.each do |element| puts "#{element[0]}\s#{element[1]}\s#{element[2]}\s#{element[3]}" end ``` 実行結果例 ``` 商品番号 XL ブルー 1 商品番号 XL レッド 1 商品番号 XL グリーン 1 ``` 今更ですが考えてみました。 正規表現以外の方法でという質問でしたが正規表現でもここからここまで みたいなことができるのではと考えた次第です。 openとreadでテキストファイル全体を読み込んで正規表現で該当する部分を抜き出します。 transposeでそれぞれの項目ごとにまとめて、形を整えます。 形を整えたら再びtransposeで商品ごとにして出力します。