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

From: KIMURA Koichi <kimura.koichi@...>
Date: 2012-03-29 02:09:25 UTC
List: ruby-list #48671
木村です。

On Thu, 29 Mar 2012 09:22:06 +0900
dezawa <dezawa@aliadne.net> 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) '\\ '

となります。



-- 
木村浩一


In This Thread