gsub
を使用して、文字列内のすべてのバックスラッシュを2つのバックスラッシュに置き換えます。
現在、私が試したのはgsub("\\\\", "\\", x)
です。これはうまくいかないようです。ただし、式を変更して各バックスラッシュを「a」に置き換えると、正常に機能します。
> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"
最後の文字は単一のバックスラッシュです。 Rは、バックスラッシュ付きのエスケープ文字を出力するため、2を出力します。 nchar
を使用すると、長さが1であることを確認できます。
この機能の原因は何ですか? gsub
の2番目の引数は正規表現ではないため、文字列リテラルに4つの円記号がある場合は、2つの円記号を持つ文字に変換する必要があります。上記の最初のgsub
呼び出しが空の文字列を返すことはあまり意味がありません。
必要なものは次のとおりです。
gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"
1つのリテラルバックスラッシュを表すために4つのバックスラッシュが必要な理由は、"\"
がR文字列と、最終的にパターンを渡す正規表現エンジンの両方のエスケープ文字だからです。正規表現エンジンと直接話している場合は、"\\"
を使用してリテラルバックスラッシュを示します。ただし、Rに"\\"
を正規表現エンジンに渡すには、"\\\\"
と入力する必要があります。
(バックスラッシュを2倍にしたい場合は、代わりにこれを使用することもできます):
gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"