こんにちは、なかむら(う)です。

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は何もしてません。


それでは。
-- 
U.Nakamaura <usa / garbagecollect.jp>