gsub 反向引用和替换为空字符串不相同

gsub back reference and replacement with empty string not identical

如何在下文中反向引用 file_version_1a.csv

vec = c("dir/file_version_1a.csv")

特别想知道为什么

gsub("(file.*csv$)", "", vec)
[1] "dir/"

好像我有一个正确的模式,但是

gsub("(file.*csv$)", "\1", vec)
[1] "dir/file_version_1a.csv"

您想提取 字符串末尾以file 开始并以csv 结束的子字符串。

由于gsub替换了匹配,而您想将其用作提取功能,您需要匹配所有文本 在字符串中。

由于与您的正则表达式不匹配的文本位于字符串的开头,因此您需要在您的模式前添加 .*(这会匹配任何零个或多个字符,如果您使用基本 R 函数中的 TRE 正则表达式,以及 perl=TRUE 动力基本 R 函数和 stringr/stringi 函数中使用的 PCRE/ICU 正则表达式中除换行符以外的任何零个或多个字符) :

vec = c("dir/file_version_1a.csv")
gsub(".*(file.*csv)$", "\1", vec)

然而,stringr::str_extract 似乎是更自然的选择:

stringr::str_extract(vec, "file.*csv$")
regmatches(vec, regexpr("file.*csv$",vec))

参见R demo online