如何使用 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
)
Time1
和 YVAR
(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\("([^"]+)"\)
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"))
使用
result <- gsub("!!rlang::sym\(\"([\w\W]*?)\"\)", "\1", string, perl=TRUE)
展开
--------------------------------------------------------------------------------
!!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"))
我正在尝试使用 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
)
Time1
和 YVAR
(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\("([^"]+)"\)
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"))
使用
result <- gsub("!!rlang::sym\(\"([\w\W]*?)\"\)", "\1", string, perl=TRUE)
展开
--------------------------------------------------------------------------------
!!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"))