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))
如何在下文中反向引用 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))