【问题标题】:Regex to split string by character and retaining content inside square brackets正则表达式按字符拆分字符串并在方括号内保留内容
【发布时间】:2018-09-06 10:00:05
【问题描述】:

你好,我有一个字符串作为这样的 linux 命令

x <- "cd/etc/init[BKSP][BKSP]it.d[ENTER]"

我想按字符分割字符串并保持方括号内的内容完整。基本上我想保留命令按下。如果使用str_split,结果将如下所示:

c("c","d","/","e","t","c","i",......"BKSP","BKSP","i","t",".", "d", "ENTER")

有人可以帮我解决这个问题吗?我一直在玩正则表达式,但还没有弄清楚如何实现这一点。

我尝试了/.*?[^[A-Z*?]/,但没有成功。我也在尝试将分隔符添加到匹配组以拆分字符串。

【问题讨论】:

  • 你能分享一下你试过的吗?
  • 我试过 /.*?[^[A-Z*?]/ 但我没有成功。我也在尝试将分隔符添加到 matchinh 组以拆分字符串。
  • 一步都搞不定strsplit(gsub('(?|\\[(\\w+)\\]|(.))', '\\1,', x, perl = TRUE), ',')
  • @rawr 这太完美了!谢谢!

标签: r regex string split character


【解决方案1】:

匹配并捕获括号内的所有子字符串,并捕获branch reset group 内的任何其他字符。然后,删除找到的匹配项中的外部方括号:

> x <- c("cd/etc/init[BKSP][BKSP]it.d[ENTER]", "abc]", "[abc")
> matches <- regmatches(x, gregexpr("(?s)(?|\\[([^][]*)]|(.))", x, perl=TRUE))
> sapply(matches, sub, pattern="\\[(.*)\\]", replacement="\\1")
[[1]]
 [1] "c"     "d"     "/"     "e"     "t"     "c"     "/"     "i"     "n"     "i"     "t"     "BKSP"  "BKSP"  "i"     "t"     "."     "d"     "ENTER"

[[2]]
[1] "a" "b" "c" "]"

[[3]]
[1] "[" "a" "b" "c"

请参阅regex demo。详情:

  • (?s) - 一个 DOTALL 修饰符,让 . 也匹配换行符
  • (?|\[([^][]*)]|(.)) - 一个分支重置组,其中在不同的交替分支中捕获组 ID 具有相同的 ID:
    • \[([^][]*)] - [ 后跟除 [] 之外的任何 0+ 字符被捕获到第 1 组,然后是 ]
    • | - 或
    • (.) - 任何字符(同样,第 1 组)。

【讨论】:

    【解决方案2】:

    这是我对您的问题的冗长解决方案(我从这篇文章中改编了方法:split string with regex

    x <- "[a] + [bc] + 1"
    
    foo <- function(x){
      #Mark square brackets with commas
      x <- gsub("\\[",",[",x)
      x <- gsub("\\]","],",x)
    
      #Separate the string based on commas
      x <- unlist(strsplit(x,","))
    
      #Find which vector elements contain brackets
      ind <- grepl("\\[.*\\]", x)
    
      y <- character()
      for (a in seq_along(x)){
        if (nchar(x[a])!=0){
          if (ind[a]){
            y <- c(y, x[a]) #Store original character
          } else {
            y <- c(y, unlist(strsplit(x[a], ""))) #Store split character
          }
        }
      }
    
      #Remove the brackets
      y <- gsub("\\[", "", y)
      y <- gsub("\\]", "", y)
      return(y)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多