0

gsub入力を正規表現として解釈しようとせず、通常の C のようなエスケープ文字列を使用するバージョンを探しています。

アップデート

質問は、奇妙な動作によって開始されました。

text.gsub("pattern", "\\\\\\")

text.gsub("pattern", "\\\\\\\\")

同じものとして扱われ、

text.gsub("pattern", "\\\\")

単一のバックスラッシュとして扱われます。

4

2 に答える 2

3

gsub の 2 番目のパラメーターのエスケープには 2 つのレイヤーがあります。

1層目はRubyの文字列定数です。\\\\\\Rubyのようにエスケープされていないように書かれている場合\\\

2 番目の層は gsub 自体です: +\\\のように扱われます\\\

二重のバックスラッシュは single: \\=>\に解決され、末尾の単一のバックスラッシュはそれ自体として解決されます。

8 つのバックスラッシュも同様の方法で解析されます。

"\\\\\\\\" => "\\\\"

その後

"\\\\" => "\\"

したがって、6 個と 8 個のバックスラッシュで構成される定数は、2 つのバックスラッシュに解決されます。

生活を少し楽にするために、ブロックを gsub 関数で使用できます。ブロック内の文字列定数は、Ruby レイヤーを介してのみ渡されます (@Sorrow に感謝)。

"foo\\bar".gsub("\\") {"\\\\"}
于 2013-04-17T11:45:41.747 に答える
2

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"
于 2013-03-28T12:03:07.467 に答える