% gsub("\\*/","'",.) %>% read.table(text=.-6ren">
gpt4 book ai didi

r - 如果它是 "quoted",我如何拆分字符串并忽略分隔符

转载 作者:行者123 更新时间:2023-12-04 01:57:08 24 4
gpt4 key购买 nike

假设我有以下字符串:

params <- "var1 /* first, variable */, var2, var3 /* third, variable */"

我想使用 , 作为分隔符拆分它,然后提取“带引号的子字符串”,所以我得到 2 个向量,如下所示:

params_clean <- c("var1","var2","var3")
params_def <- c("first, variable","","third, variable") # note the empty string as a second element.

我在广义上使用术语“引用”,这里使用任意字符串,/**/,它们可以保护子字符串不被拆分。

我找到了一个基于 read.table 的解决方法,事实上它允许引用元素:

library(magrittr)
params %>%
gsub("/\\*","_temp_sep_ '",.) %>%
gsub("\\*/","'",.) %>%
read.table(text=.,strin=F,sep=",") %>%
unlist %>%
unname %>%
strsplit("_temp_sep_") %>%
lapply(trimws) %>%
lapply(`length<-`,2) %>%
do.call(rbind,.) %>%
inset(is.na(.),value="")

但它非常丑陋和骇人听闻,有什么更简单的方法吗?对于这种情况,我认为必须有一个 regex 来提供给 strsplit

this question 有关

最佳答案

你可以使用

library(stringr)
cmnt_rx <- "(\\w+)\\s*(/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/)?"
res <- str_match_all(params, cmnt_rx)
params_clean <- res[[1]][,2]
params_clean
## => [1] "var1" "var2" "var3"
params_def <- gsub("^/[*]\\s*|\\s*[*]/$", "", res[[1]][,3])
params_def[is.na(params_def)] <- ""
params_def
## => [1] "first, variable" "" "third, variable"

主要的正则表达式细节(实际上是 (\w+)\s*)(COMMENTS_REGEX)? ):

  • (\w+) - 捕获第 1 组:一个或多个单词字符
  • \s* - 0+ 个空白字符
  • ( - 捕获第 2 组开始
  • /\* - 匹配评论开始/*
  • [^*]*\*+ - 匹配除 * 以外的 0+ 个字符后跟 1+ 个文字 *
  • (?:[^/*][^*]*\*+)* - 0+序列:
    • [^/*][^*]*\*+ - 不是 /* (与 [^/*] 匹配)后跟 0+ 个非星号字符 ([^*]*) 后跟 1+ 个星号 (\*+)
  • / - 关闭 /
  • )? - 捕获第 2 组结束,重复 1 次或 0 次(这意味着它是可选的)。

参见 regex demo .

"^/[*]\\s*|\\s*[*]/$" gsub 中的图案删除 /**/有相邻的空间。

params_def[is.na(params_def)] <- ""部分替换 NA带有空字符串。

关于r - 如果它是 "quoted",我如何拆分字符串并忽略分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49775648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com