[#50128] sprintf のフォーマット — dezawa <dezawa@...>

出沢です

20 messages 2015/05/03
[#50129] Re: sprintf のフォーマット — Yukihiro Matsumoto <matz@...> 2015/05/04

まつもと ゆきひろです

[#50130] Re: sprintf のフォーマット — Tanaka Akira <akr@...> 2015/05/04

MjAxNeW5tDXmnIg05pelIDEyOjAzIFl1a2loaXJvIE1hdHN1bW90byA8bWF0ekBydWJ5Lm9yLmpw

[#50131] Re: sprintf のフォーマット — Nobuyoshi Nakada <nobu@...> 2015/05/04

MjAxNeW5tDXmnIg05pel5pyI5puc5pel44CBVGFuYWthIEFraXJhPGFrckBmc2lqLm9yZz7jgZXj

[ruby-list:50153] Re: String.deleteでバックスラッシュの削除

From: "U.NAKAMURA" <usa@...>
Date: 2015-05-13 18:15:33 UTC
List: ruby-list #50153
こんにちは、なかむら(う)です。

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>

In This Thread