我正在尝试使用 gsub 从以下字符串中删除字符:
string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
新字符串应返回:
cat(string)
function(data, x = Time1, y = YVAR, values = c("a", "b"))
也就是说,我想删除!!rlang::sym(\"
,保留Time1
,并删除Time1后面的右引号和括号\")
(我还想为 YVAR
删除它)
Time1
和 YVAR
(x 和 y 变量名称)是任意的,可以在结果字符串中命名为任何名称,但是字符 !!rlang: :sym(\"
以及需要保留的任意字符串后面的右引号和括号\")
是不变的,不会改变。
我明白我可以简单地使用
result <- gsub("!!rlang::sym(\"", "", string, fixed = TRUE)
然后
result <- gsub("\")", "", result, fixed = TRUE)
但是,为了实现这一目标,我想找到一个更优雅的正则表达式解决方案,可以将这两个 gsub 结合起来,当然也不会删除结束的 "\")"
in values = c(\"a\",\"b\"))"
最佳答案
如果它始终是文字!!rlang::sym("
,那么这个
cat( gsub('!!rlang::sym\\("(\\S+)"\\)', "\\1", string), "\n" )
# function(data, x = Time1, y = YVAR), values = c("a", "b"))
如果它是函数调用/paren/quote,那么它可以概括一点。我认为您需要一些特殊性,否则您会解析出比您想要的更多的内容。我假设需要 rlang
:
gsub('\\S+rlang\\S+\\("(\\S+)"\\)', "\\1", string)
请注意,示例字符串
中有两个右括号,!!rlang::sym(\"YVAR\"))
,它们阻碍了模式只是一点点。如果这是真的,那么...要么使用 "\\)+
查找重复项,要么...其他内容。
关于r - 如何使用 gsub 删除字符串中任意字符之前和之后的特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65742836/