gsub
入力を正規表現として解釈しようとせず、通常の C のようなエスケープ文字列を使用するバージョンを探しています。
アップデート
質問は、奇妙な動作によって開始されました。
text.gsub("pattern", "\\\\\\")
と
text.gsub("pattern", "\\\\\\\\")
同じものとして扱われ、
text.gsub("pattern", "\\\\")
単一のバックスラッシュとして扱われます。
gsub
入力を正規表現として解釈しようとせず、通常の C のようなエスケープ文字列を使用するバージョンを探しています。
アップデート
質問は、奇妙な動作によって開始されました。
text.gsub("pattern", "\\\\\\")
と
text.gsub("pattern", "\\\\\\\\")
同じものとして扱われ、
text.gsub("pattern", "\\\\")
単一のバックスラッシュとして扱われます。
gsub の 2 番目のパラメーターのエスケープには 2 つのレイヤーがあります。
1層目はRubyの文字列定数です。\\\\\\
Rubyのようにエスケープされていないように書かれている場合\\\
2 番目の層は gsub 自体です: +\\\
のように扱われます\\
\
二重のバックスラッシュは single: \\
=>\
に解決され、末尾の単一のバックスラッシュはそれ自体として解決されます。
8 つのバックスラッシュも同様の方法で解析されます。
"\\\\\\\\" => "\\\\"
その後
"\\\\" => "\\"
したがって、6 個と 8 個のバックスラッシュで構成される定数は、2 つのバックスラッシュに解決されます。
生活を少し楽にするために、ブロックを gsub 関数で使用できます。ブロック内の文字列定数は、Ruby レイヤーを介してのみ渡されます (@Sorrow に感謝)。
"foo\\bar".gsub("\\") {"\\\\"}
gsub
最初のパラメータとして文字列を受け入れます:
the pattern is typically a Regexp; if given as
a String, any regular expression metacharacters
it contains will be interpreted literally
例:
"hello world, i am thy code".gsub("o", "-foo-")
=> "hell-foo- w-foo-rld, i am thy c-foo-de"