R - gsub替换反斜杠

25

我想使用gsub函数将字符串中每个反斜杠替换为2个反斜杠。

目前,我尝试的方法是gsub("\\\\", "\\", x),但似乎不起作用。然而,如果我将表达式更改为用"a"替换每个反斜杠,它可以正常工作。

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

最后一个字符只是一个单反斜杠;R只打印2,因为它使用反斜杠打印转义字符。使用nchar确认长度为1。

是什么导致了这种功能?gsub的第二个参数不是正则表达式,所以在字符串字面值中有4个反斜杠应该被转换为具有2个反斜杠的字符。更让人费解的是,上面的第一个gsub调用返回一个空字符串。


1
我认为你的参数顺序混淆了。第一个参数是你要查找的内容。因此,如果你想将每个斜杠替换为两个斜杠,难道不应该使用:gsub("\\\\", "\\\\\\\\", x)吗?此外,如果您使用 cat() 函数而不是默认的 print() 函数来输出值,您将无法看到斜线的转义部分。 - MrFlick
请参见这里 - David Arenburg
1个回答

50

这是你需要的:

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

为什么需要用四个反斜杠来表示一个字面上的反斜杠呢?这是因为在R字符和正则表达式引擎中,"\"都是转义字符。如果直接对正则表达式引擎进行操作,你必须使用"\\"来表示一个字面上的反斜杠。但是为了让R将"\\"传递给正则表达式引擎,你需要输入"\\\\"


(如果你只是想要双倍反斜杠,可以改用以下代码):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"

是的,我是通过试错找到的。我一直在想为什么会出现上述行为。第二个参数不是正则表达式,因此结果应该与第二个参数的长度相同。在这个例子中,第二个参数有4个字符长,但结果只有2个字符长。 - Jon Claus
1
第二个参数可能不是正则表达式,但是在其中,“\”反斜杠仍然被解释为转义字符。它在类似于这样的调用的第二个参数中被用作这样:gsub("([[:digit:]]*)\\s*([[:alpha:]]*)", "\\2---->\\1", "101 trombones") - Josh O'Brien
1
我很惊讶在我的第一个例子中它没有抱怨,因为第二个参数中只有一个转义字符而已。我知道如果在正则表达式中做同样的事情,比如在第一个参数中,会因为尾随反斜杠而抛出错误。 - Jon Claus
@JonClaus 同意。这是我感到困惑的部分。 - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接