Regex 使用正则表达式拆分字符串

Regex 使用正则表达式拆分字符串,regex,r,strsplit,Regex,R,Strsplit,我希望拆分一个通用形式的字符串,其中方括号表示字符串的“部分”。例: x <- "[a] + [bc] + 1" 编辑:最终使用以下命令: x <- "[a] + [bc] + 1" x <- gsub("\\[",",[",x) x <- gsub("\\]","],",x) strsplit(x,",") x这是一种懒惰的方法: FUN <- function(x) { all <- unlist(strsplit(x, "\\s+"))

我希望拆分一个通用形式的字符串,其中方括号表示字符串的“部分”。例:

x <- "[a] + [bc] + 1"
编辑:最终使用以下命令:

x <- "[a] + [bc] + 1"
x <- gsub("\\[",",[",x)
x <- gsub("\\]","],",x)
strsplit(x,",")

x这是一种懒惰的方法:

FUN <- function(x) {
    all <- unlist(strsplit(x, "\\s+"))
    last <- paste(c(" ", tail(all, 2)), collapse="")
    c(head(all, -2), last)
}

x <- "[a] + [bc] + 1"    
FUN(x)

## > FUN(x)
## [1] "[a]"  "+"    "[bc]" " +1"

FUN您可以手动计算分割点并使用
子字符串

split.pos <- gregexpr('\\[.*?]',x)[[1]]
split.length <- attr(split.pos, "match.length")
split.start <- sort(c(split.pos, split.pos+split.length))
split.end <- c(split.start[-1]-1, nchar(x))
substring(x,split.start,split.end)
#  [1] "[a]"  " + "  "[bc]" " + 1"

split.pos我看过Tylerlinker的代码,并怀疑它可能比这更清楚,但这可能是学习不同函数集的一种方法。(在我注意到它在空格上分裂之前,我更喜欢它。)我尝试将此函数调整为使用strsplit
,但该函数总是删除分隔符。 也许这可以用来制作一个
newstrsplit
,在分隔符处拆分,但将它们留在中间?可能不需要在第一个或最后一个位置拆分,并区分打开和关闭分离器

scan(text=   # use scan to separate after insertion of commas
            gsub("\\]", "],",   # put commas in after "]"'s
            gsub(".\\[", ",[",  x)) ,  # add commas before "[" unless at first position
        what="", sep=",")    # tell scan this character argument and separators are ","
#Read 4 items
#[1] "[a]"  " +"   "[bc]" " + 1"

这是一个在括号上拆分的版本,并使用正向向前看和向后看将它们保留在结果中:

splitme <- function(x) {
  x <- unlist(strsplit(x, "(?=\\[)", perl=TRUE))
  x <- unlist(strsplit(x, "(?<=\\])", perl=TRUE))
  for (i in which(x=="[")) {
    x[i+1] <- paste(x[i], x[i+1], sep="")
  }
  x[-which(x=="[")]
}
splitme(x)
#[1] "[a]"  " + "  "[bc]" " + 1"

splitme您之所以说“lazy”,是因为您使用的是空格,而不是括号来分隔?是的(没有真正的密集regexing),我们开始吧。朝着“新分裂”的方向取得了巨大进展。我并不完全理解它,但我认为
gregexpr
会很有用。我很惊讶你不需要在模式中使用“\]”。我认为
]
不需要转义,因为它不被解释为字符类的结尾,因为
[
是。嗯,我不太清楚:-)我有同样的想法,但它表明“特殊性”我喜欢这种方法,因为它不依赖于空白来分割。在这个任务中保持输出中的空白对于这个任务并不重要,所以我修改了它来使用<代码> Strup:谢谢你的积极评论,但是我认为@ JuBA是一个更好的答案。我要用它。构造一个简单的解析函数,该函数接受一对参数来表示将保留的开始和结束分隔符。
splitme <- function(x) {
  x <- unlist(strsplit(x, "(?=\\[)", perl=TRUE))
  x <- unlist(strsplit(x, "(?<=\\])", perl=TRUE))
  for (i in which(x=="[")) {
    x[i+1] <- paste(x[i], x[i+1], sep="")
  }
  x[-which(x=="[")]
}
splitme(x)
#[1] "[a]"  " + "  "[bc]" " + 1"