まつもと ゆきひろです

In message "[ruby-list:7380] string replace"
    on 98/04/08, KANEKO Naoshi <wbs01621 / mail.wbs.or.jp> writes:

|金子です。
|
|再び、文字列置換の話です。
|
|2日前に次の2つの問題点を指摘しました。
|
|  1) 置換文字列の最後に '\\' があるとき、文字列の終端を超えて
|     1バイト余分に出力してしまう。
|
|      => 終端の '\\' は加工せずにそのまま出力。
|
|  2) '\\\\' が '\\' に置換されてしまう。
|
|      => '\\\\' --> '\\\\' として出力。
|
|1)は単純なコーディングミスと思われます。これは問題ないでしょう。
|問題は 2) です。
|これを perl では '\\\\' は '\\\\' となるし、これもコーディングミス
|と思って、perl に合わせるように修正したつもりなのですが、どうも単純
|な問題ではないような気がしてきました。
|
|2)の修正を入れてしまうと、1バイトの '\' を正しく表現する方法がな
|いような気がするのです。

その通りですね.また,sub/gsubの2番目の引数は '' を指定する
ことをお勧めしてます.これなら \\ と \' 以外は \ をそのまま
通すので,問題が減ります.

|perl と違うし、直感的でもないのですが、現在の仕様は正解なので
|しょうか?

ではないかと思います.emacsの正規表現とかだと \ のエスケープ
が重なってなかなか楽しいことになります.

|直感的に、かつ、仕様をすっきりさせるためには、メタ文字を変えて
|しまうとかしかないのでしょうか?

まあ,そういうことになると思いますが,メタ文字を選ぶってのは
なかなか難しいものなので,適切な文字を選ぶのはなかなかうまく
いかないかも知れません.

|# 私の知らない置換文字列の特殊表記法があるっていうのでもいいのですが...

いやあ,イテレータ以外の方法は無いです.''を使うとちょっとま
しくらいですかね.
                                まつもと ゆきひろ /:|)