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

Why is my regex backreference in R being reversed when I use one backslash with gsub?

我不明白为什么我需要使用两个反斜杠来防止我的反向引用被逆转。下面,我详细说明我是如何发现我的问题的:

我想改造一个像这样的角色:

x <- 53/100 000

并将其转换为如下所示:

53/100000

这里是我来问这个问题之前的一些想法:

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

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

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

然后我了解到您可以使用 this website 中的 </code> 反向引用捕获的模式。所以我开始使用这个:</p> <p><code>> gsub("/.+\s","",x) [1] "53[=16=]1000"

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

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

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

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

此外,通过在模式开头插入左括号,我能够从替换中删除 / 字符:

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

嗯,看来需要做两件事:括号和额外的反斜杠。我认为括号是我理解的,因为我相信括号表示您反向引用的文本部分。

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

需要额外的反斜杠,这样 R 就不会在将“\1”传递给 gsub 之前将其解析为转义字符。 "\\1" 被 gsub 读取为正则表达式 \1。