首页 > 解决方案 > 如何使用 gsub 删除字符串中任意字符前后的特定字符

问题描述

我正在尝试使用 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 之后的右引号和括号\")(我也想删除这个 for YVAR

Time1YVAR(x 和 y 变量名称) 是任意的,可以在结果字符串中命名任何内容,但是,需要保留的任意字符串之后的字符!!rlang::sym(\"和右引号和括号是恒定的,不会改变。\")

我知道我可以简单地使用

result <- gsub("!!rlang::sym(\"", "", string, fixed = TRUE)

然后

 result <- gsub("\")", "", result, fixed = TRUE)

但是,为了获得其中的一部分,我想找到一个更优雅的正则表达式解决方案,它可以结合这两个 gsub 并且当然也不会删除"\")"关闭values = c(\"a\", \"b\"))"

标签: rregexgsub

解决方案


如果它总是字面量!!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)

请注意,您的示例string,中有两个右括号!!rlang::sym(\"YVAR\")),它们稍微阻碍了模式。如果那是真实的,那么......要么寻找重复"\\)+或......其他东西。


推荐阅读