当我在gsub中使用一个反斜杠时,为什么我的正则表达式反向引用反转?

时间:2017-09-18 21:28:16

标签: r regex gsub backreference

我不明白为什么我需要使用两个反斜杠来防止反向反转。下面,我详细介绍了我如何发现问题:

我想转换一个看起来像这样的角色:

x <- 53/100 000

将其转换为如下所示:

53/100000

在我提出这个问题之前,我有一些想法:

我认为我可以使用函数gsub删除/字符后出现的所有空格。但是,我认为正则表达式解决方案可能更优雅/更有效。

起初,我不知道如何在正则表达式中进行反向引用,所以我尝试了这个:

> gsub("/.+\\s",".+",x) [1] "53.+000"

然后我读到您可以使用this website中的\1反向引用捕获的模式。所以我开始使用它:

> gsub("/.+\\s","\1",x) [1] "53\001000"

然后我意识到反向引用只考虑通配符匹配。但我想保留/字符。所以我把它添加回来了:

> gsub("/.+\\s","/\1",x) [1] "53/\001000"

然后我尝试了其他一些东西,但我通过添加一个额外的反斜杠并将我的通配符括在括号中来修复它:

> gsub("/(.+)\\s","/\\1",x) [1] "53/100000"

此外,我可以通过在模式的开头插入左括号来删除替换中的/字符:

> gsub("(/.+)\\s","\\1",x) [1] "53/100000"

嗯,所以似乎需要两件事:圆括号和额外的反斜杠。我认为我理解的括号,因为我相信括号表示你反向引用的文本部分是什么。

我不明白为什么需要两个反斜杠。来自the reference website据说只需要\l。这里发生了什么?为什么我的反向引用被颠倒了?

1 个答案:

答案 0 :(得分:2)

需要额外的反斜杠,以便R不解析&#34; \ 1&#34;在将它传递给gsub之前作为转义字符。 &#34; 1 \\&#34;被gsub读为正则表达式\。