[ruby-list:49614] Re: ダブルバックスラッシュとバックスラッシュの入り混じる文字列のsplit

From: 村岡 恒輝 <magi.select@...>
Date: 2013-09-28 15:01:46 UTC
List: ruby-list #49614
古川さま、みなさま

早速のご返信ありがとうございます。
実は、先ほどの文字列

first\\ sec\ond\\ third\\

は外部のテキストファイルに含まれているものなので、これをFile.openで開いてreadで読み込んでしまうと、やはり\と\\の見分けがつかなくなってしまうのが、当方の問題の本質でした。
状況説明が不十分で申し訳ありません。
再度ご教示願えればと思います。

村岡


2013/9/28 古川大輔 <mogya99@yahoo.co.jp>

> 頭の体操みたいで楽しいですね。
>
> 案1 素直に文法どおりに書く
>
> 文字列中に\を書きたいときは\\と書くのがルールですので、元の文字列もこのルールに従ってエスケープすれば、
>
> irb(main):009:0>  'first\\\\ sec\\ond\\\\ third\\\\
> fourth\\\\'.split('\\\\')
> => ["first", " sec\\ond", " third", " fourth"]
> という具合で一応望む結果を得ることができます。
>
>
> とはいえ、これでは元の文字列をそのまま書いているという気分は薄いかも知れないですね。
>
> 案2 ヒアドキュメントを使う
>
> >シングルクォー トで囲ったヒアドキュメントの場合、' をエスケープする必要がないというこ
> >とは、\の特別扱いも必要ないということになる。つまり、シングルクォート
> >で囲ったヒアドキュメントは完全に書いたままの文字列になる。
> http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#string
>
> ということで、これを使えば\も\\も文字通りに解釈してもらえます。
>
> irb(main):016:> str=<<'EOS'
> irb(main):017:0' first\\ sec\ond\\ third\\ fourth\\
> irb(main):018:0' EOS
> irb(main):019:0> str.chop.split('\\\\')
> => ["first", " sec\\ond", " third", " fourth"]
>
> 最後にchopで改行を落とさないといけないのがすこし悔しいですが、
> 一応メタ文字はそのまま書けるのでこんなもんでいかがでしょうか?
>
> /Daisuke
>
> ----- Original Message -----
> >From: 村岡 恒輝 <magi.select@gmail.com>
> >To: ruby-list@ruby-lang.org
> >Date: 2013/9/28, Sat 19:41
> >Subject: [ruby-list:49610] ダブルバックスラッシュとバックスラッシュの入り混じる文字列のsplit
> >
> >
> >初めまして、村岡と申します。
> >'first\\ sec\ond\\ third\\'
> >という文字列をバックスラッシュは無視し、ダブルバックスラッシュでsplitすることで
> >["first", " sec\ond", " third"]
> >を得たいのですが、
> >>> 'first\\ sec\ond\\ third\\ fourth\\' #=> "first\\ sec\\ond\\ third\\
> fourth\\"
> >>> "first\\ sec\ond\\ third\\ fourth\\" #=> "first\\ second\\ third\\
> fourth\\"
>
> >と、rubyに文字列を読み込ませた瞬間、メタ文字が解釈されてダブルバックスラッシュとバックスラッシュの見分けがつかなくなり、splitできなくなってしまうように思われるのですが、良い方法はあるのでしょうか。
> >アドバイス頂ければ幸いです。
> >--
> >村岡
> >magi.select@gmail.com
> >
> >
>

In This Thread