2012年3月29日

[ruby-list:48671] Re: "a_b$c" を"a\_b\$c" に変換したいのですが、、、

木村です。

On Thu, 29 Mar 2012 09:22:06 +0900
dezawa <dezawa@xxxxx> wrote:

> PS
> シングルクォートに囲まれた連続する \ の扱いが、単なる文字リテラル
> ではマニュアル通りですが、sub,gsub の replace ではおかしくなって

> 居る様です。
(略)
> sub や gsub の replace の時の扱いがおかしいです。
> puts"a_b$c".gsub(/[_$]/,'\\\ ') # => (1)a\ b\ c
> puts"a_b$c".gsub(/[_$]/,'\\\\') # => (2)a\b\c
> puts"a_b$c".gsub(/[_$]/,'\\\\\ ') # => (3)a\\ b\\ c
> puts"a_b$c".gsub(/[_$]/,'\\\\\\') # => (4)a\\b\\c
> puts"a_b$c".gsub(/[_$]/,'\\\\\\ ')# => (5)a\\ b\\ c
>
> マニュアル通りなら各々下の様になるのでは?
> a\\ b\\ c、a\\b\\c、a\\\ b\\\ c、a\\\b\\\c、a\\\ b\\\ c

信岡さんのメールにあった以下の記述を思い出してください。

> よって、String#gsub メソッドの第 2 引数に渡す文字列の中で、単なるバックスラッシュに
> 変換される文字を表すためには、バックスラッシュを 4 つ重ねて記す必要があります。

dezawa さんの例の文字列は gsub に渡された時点でそれぞれ以下のようになります
#ここでクォートでくくるのはわかりにくくしてしまう気もするんですが空白もあるんで。

(1) '\ '
(2) '\\'
(3) '\\\ '
(4) '\\\'
(5) '\\\ '

gsub がこれに対してさらに \ の解釈を行います。その結果、置換後の文字列として指定されるのは

(1) '\ '
(2) '\'
(3) '\\ '
(4) '\\'
(5) '\\ '

となります。

--
木村浩一

投稿者 xml-rpc : 2012年3月29日 11:09
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/109221
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。