如何使用 gsub 删除字符串中任意字符前后的特定字符

How can I use gsub to remove specific characters before and after an arbitrary character in string

我正在尝试使用 gsub 从以下字符串中删除字符:

string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"

新字符串应该return:

cat(string)
function(data, x = Time1, y = YVAR, values = c("a", "b"))

也就是说,我想去掉!!rlang::sym(\",保留Time1,去掉Time1\")后面的右引号和括号(我也想删除 YVAR)

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

我知道我可以简单地使用

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

然后

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

但是,为了达到目的,我想找到一个更优雅的正则表达式解决方案,它可以将这两个 gsub 结合起来,当然也不会删除 [=] 中的结尾 "\")" 23=]

如果它总是文字 !!rlang::sym(",那么这个

cat( gsub('!!rlang::sym\("(\S+)"\)', "\1", string), "\n" )
# function(data, x = Time1, y = YVAR), values = c("a", "b")) 

如果是function-call/paren/quote,那么可以泛化一点。我想你会想要 一些 特异性,否则你会解析出比你想要的更多的东西。我假设 rlang 是必需的:

gsub('\S+rlang\S+\("(\S+)"\)', "\1", string)

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

您可以使用带有捕获组的单个模式,该模式将匹配 " 以外的任何字符,并在替换中使用组 1。

!!rlang::sym\("([^"]+)"\)

Regex demo

string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
cat(gsub('!!rlang::sym\("([^"]+)"\)', "\1", string))

输出

function(data, x = Time1, y = YVAR), values = c("a", "b"))

R demo

使用

result <- gsub("!!rlang::sym\(\"([\w\W]*?)\"\)", "\1", string, perl=TRUE)

proof

展开

--------------------------------------------------------------------------------
  !!rlang::sym             '!!rlang::sym'
--------------------------------------------------------------------------------
  \(                       '('
--------------------------------------------------------------------------------
  \"                       '"'
--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    [\w\W]*?                 any character of: word characters (a-z,
                             A-Z, 0-9, _), non-word characters (all
                             but a-z, A-Z, 0-9, _) (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
  )                        end of 
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  \)                       ')'

R proof:

string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
result <- gsub("!!rlang::sym\(\"([\w\W]*?)\"\)", "\1", string, perl=TRUE)
cat(result)

结果function(data, x = Time1, y = YVAR), values = c("a", "b"))