次のように、文字列内のバックスラッシュを 2 つのバックスラッシュに置き換えようとしています。
str.gsub!("\\", "\\\\")
しかし、それは何もしません。よくわかりません...
この回答は、Ruby 1.9 のコンテキストで与えられたものであることに注意してください。ruby 2.0 には新しい正規表現エンジンがあるため、そのコンテキストでは有効でない可能性があります。
これは機能します:
str.gsub!("\\", "\\\\\\")
str.gsub!("\\", "\\\\\\\\") # also, will always work
編集:説明(@vacheが提供するhttp://www.ruby-forum.com/topic/143645経由)
免責事項: 私は ruby の正規表現エンジンの内部の仕組みに詳しくありません。ここに記載されている情報はすべて、上記の記事から差し引かれています。
知っておくべき基本的なことは、置換文字列が 2 回評価されるということです。
最初にスラッシュが文字列内のエスケープとして機能し、2 回目に gsub が文字列でグループ参照を検索します。
@chris-johnsen が述べたように、6 つのスラッシュが常に機能するとは限りません。これは、次のようなことが起こっていると私に信じさせます。
6回斬り用。3 つのスラッシュがグループ参照レイヤーに渡されます。末尾のスラッシュは、その後に何も来ていないため、エスケープ文字ではなくバックスラッシュとして解釈されます。最後に、このレイヤーは 2 つのスラッシュを返します。3 番目のスラッシュがエスケープ文字として機能するようになったため、何かが後に続く場合、式は失敗します。
8 つのスラッシュの場合: 4 つのスラッシュがグループ参照レイヤーに渡されます。4 つのスラッシュが 2 つに減ります。