在R的正则表达式中是否有类似于"&"的等效项,用于反向引用整个匹配?

6

当我使用vim时,我经常使用&来在替换操作中回溯整个匹配。例如,以下代码将所有的“foo”替换为“foobar”:

%s/foo/&bar/g

这里的好处是懒惰:我不必在匹配中键入括号,并且只需为替换中的反向引用键入一个字符,而不是两个。也许更重要的是,我不必在键入匹配时找到我的反向引用,减少了认知负荷。
是否有R正则表达式中类似于我在vim中使用的“&”符号的等效物(可能使用“perl=T”参数)?

当你说“在R中”时要小心。在R中有大量的正则表达式匹配/替换函数:一些在base包中,一些在stringi/stringr中,还有一些在其他地方等等。答案取决于使用的包。 - smci
2个回答

7
在基本的R语言中,使用sub/gsub函数进行文本替换时,答案是否定的。请参考此引用,其中指出没有针对整个匹配的替换文本令牌。可以将整个正则表达式放在一个捕获组中,然后使用\1来插入整个正则表达式的匹配结果。
而在stringr包中,可以使用\0
> library(stringr)
> str_replace_all("123 456", "\\d+", "START-\\0-END")
[1] "START-123-END START-456-END"

0
我们可以使用gsubfn
library(gsubfn)
gsubfn("\\d+", ~paste0("START-", x, "-END"), "123 456")
#[1] "START-123-END START-456-END"

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