当我使用vim时,我经常使用&
来在替换操作中回溯整个匹配。例如,以下代码将所有的“foo”替换为“foobar”:
%s/foo/&bar/g
这里的好处是懒惰:我不必在匹配中键入括号,并且只需为替换中的反向引用键入一个字符,而不是两个。也许更重要的是,我不必在键入匹配时找到我的反向引用,减少了认知负荷。
是否有R正则表达式中类似于我在vim中使用的“&”符号的等效物(可能使用“perl=T”参数)?
当我使用vim时,我经常使用&
来在替换操作中回溯整个匹配。例如,以下代码将所有的“foo”替换为“foobar”:
%s/foo/&bar/g
sub
/gsub
函数进行文本替换时,答案是否定的。请参考此引用,其中指出没有针对整个匹配的替换文本令牌。可以将整个正则表达式放在一个捕获组中,然后使用\1
来插入整个正则表达式的匹配结果。stringr
包中,可以使用\0
。> library(stringr)
> str_replace_all("123 456", "\\d+", "START-\\0-END")
[1] "START-123-END START-456-END"
gsubfn
。library(gsubfn)
gsubfn("\\d+", ~paste0("START-", x, "-END"), "123 456")
#[1] "START-123-END START-456-END"
base
包中,一些在stringi/stringr
中,还有一些在其他地方等等。答案取决于使用的包。 - smci