Чистое решение на основе регулярных выражений будет выглядеть как
x <- "abc[[+de.f[-[[g"
v <- c("+", "-", "[", "[[")
## Escaping function
regex.escape <- function(string) {
gsub("([][{}()+*^$|\\\\?])", "\\\\\\1", string)
}
## Sorting by length in the descending order function
sort.by.length.desc <- function (v) v[order( -nchar(v)) ]
pat <- paste(regex.escape(sort.by.length.desc(v)), collapse="|")
pat <- paste0("(?s)", pat, "|(?:(?!", pat, ").)+")
res <- regmatches(x, gregexpr(pat, x, perl=TRUE))
## => [[1]]
## [1] "abc" "[[" "+" "de.f" "[" "-" "[[" "g"
См. R демо онлайн . Регулярное выражение PCRE здесь
(?s)\[\[|\+|-|\[|(?:(?!\[\[|\+|-|\[).)+
См. Демонстрационный пример регулярных выражений и график Regulex:

Детали
(?s)
- модификатор DOTALL, который .
соответствует любому символу, включая переводы строки
\[\[
- [[
подстрока (экранированная regex.escape
)
|
- или
\+
- +
|-
- или -
(не нужно экранировать -
, поскольку он не находится внутри класса символов)
|\[
- или [
|
- или
(?:(?!\[\[|\+|-|\[).)+
- жадный жетон , который соответствует любому символу (.
), 1 или более повторений как можно больше (+
в конце), который не запускается aa [[
, +
, -
или [
последовательности символов (узнайте больше о жадном жетоне ).
Вы также можете рассмотреть решение с менее интенсивным регулярным выражением с помощью регулярного выражения TRE:
x <- "abc[[+de.f[-[[g"
v <- c("+", "-", "[", "[[")
## Escaping function
regex.escape <- function(string) {
gsub("([][{}()+*^$|\\\\?])", "\\\\\\1", string)
}
## Sorting by length in the descending order function
sort.by.length.desc <- function (v) v[order( -nchar(v)) ]
## Interleaving function
riffle3 <- function(a, b) {
mlab <- min(length(a), length(b))
seqmlab <- seq(length=mlab)
c(rbind(a[seqmlab], b[seqmlab]), a[-seqmlab], b[-seqmlab])
}
pat <- paste(regex.escape(sort.by.length.desc(v)), collapse="|")
res <- riffle3(regmatches(x, gregexpr(pat, x), invert=TRUE)[[1]], regmatches(x, gregexpr(pat, x))[[1]])
res <- res[res != ""]
## => [1] "abc" "[[" "+" "de.f" "[" "-" "[[" "g"
См. Демоверсию R .
Таким образом, элементы поиска должным образом экранированы для использования в регулярном выражении, они сортируются по длине в порядке убывания, шаблон регулярного выражения, основанный на чередовании, строится динамически, затем обнаруживаются все совпадающие и несовпадающие строки, а затем они объединяются в один символьный вектор и пустые элементы в конце отбрасываются.