From: MASAKI Yuhsuke Date: 2015-05-14T21:30:26+09:00 Subject: [ruby-list:50154] Re: String.deleteでバックスラッシュの削除 正木です。 RubyとZshにおけるシングルクォート内のバックスラッシュの挙動を誤解していた (Rubyは'直前以外の、Zshは全てのバックスラッシュをそのままにするのだと理解していた) のが原因だったようです。お恥ずかしい… $ print '\(Ruby Users\)' (Ruby Users) 全くそのとおりでした。 ありがとうございました。 You wrote: > こんにちは、なかむら(う)です。 > > In message "[ruby-list:50152] String.deleteでバックスラッシュの削除" > on Wed, 13 May 2015 20:53:29 +0900, yek@reasonset.net wrote: > > 文字列中のバックスラッシュを削除しようとして > > > > mailobj.list = $1.delete('"\<>/!?') > > String#deleteの引数は単にその文字列中の文字を意味するのではな > くて、- と ^ に特別な意味があり、またこの2文字を普通の文字と > して扱うために \ にエスケープの意味が与えられています。 > そのため、\ は末尾に置かれた場合以外では \ という文字そのもの > としては解釈されませんので、2重に重ねる必要があります。 > > なのですが、 > > > mailobj.list = $1.delete('"\\<>/!?') > > > > でも残り、 > > ややこしいことに、単に文字列リテラル中に \\ と書いても、それ > 文字列リテラルのエスケープ表記とみなされて、結局 \ 一文字にな > ってしまうため、\ と書いても \\ と書いても同じことになります。 > (後続の文字によっては異なることもありますが、とりあえずこの場 > 合はそう) > > というわけで、正解は > > $1.delete('"\\\\<>/!?') > > と書く、ということになります。 > > もちろん、先に書いたように \ は末尾に置かれた場合はエスケープ > の意味を失いますので、 > > > mailobj.list = $1.delete('"<>/!?\\') > > も正解です。 > > > > にすると消えるのですが、コマンドライン上でシンプルにテストすると > > > > print '\(Ruby Users\)' | ruby -e 'p STDIN.read.delete('"'"'\<>/\!?'"')" > > > > であっても消えます。 > > これは一体何でしょう?? > > シェルが食べちゃってますから、単に > > print '\(Ruby Users\)' > > だけでもう消えてると思いますよ。Rubyは何もしてません。 > > > それでは。 ****************************** * The Rider, Hacker and Musician. * +++ ENABLE YOUR HEART +++ ****************************** * MASAKI Yuhsuke. * yek@reasonset.net * Website: http://reasonset.net/ * GitHub : https://github.com/reasonset/ * Twitter: @reasonset ******************************