簡體   English   中英

如何使用 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\"))"

新字符串應返回:

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,當然也不會刪除values = c(\"a\", \"b\"))" "\")" 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)

請注意,您的示例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))

Output

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

R 演示

利用

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

證明

擴展

--------------------------------------------------------------------------------
  !!rlang::sym             '!!rlang::sym'
--------------------------------------------------------------------------------
  \(                       '('
--------------------------------------------------------------------------------
  \"                       '"'
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [\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 \1
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  \)                       ')'

參見R 證明

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"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM