[ruby-list:48672] Re: "a_b$c" を "a\_b\$c" に変換したいのですが、、、
From:
dezawa <dezawa@...>
Date:
2012-03-29 04:16:05 UTC
List:
ruby-list #48672
ありがとうございます。 gsubも解釈するのかな、と思ったのは当たってはいたが 詰めが甘かったです。 にしても '\a' と '\\\\a' が同じ結果、というのも分かりにくい、、 ブロックを使うのを何となく避けていたのですが、そちらの 方に移行していきます。 # そういえばこの話、ずーーーーーーーっと以前に見たような。 > 木村です。 > > 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) '\\ ' > > となります。 > > >