2012年3月29日

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

ありがとうございます。
gsubも解釈するのかな、と思ったのは当たってはいたが
詰めが甘かったです。

にしても '\a' と '\\\\a' が同じ結果、というのも分かりにくい、、
ブロックを使うのを何となく避けていたのですが、そちらの
方に移行していきます。

# そういえばこの話、ずーーーーーーーっと以前に見たような。


> 木村です。
>
> 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日 13:16
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/109222
トラックバック
コメント
コメントする




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