这里有两种解决方案,它们都使用strsplit,但它们的拆分方式不同:
1) 在换行符处拆分 删除所有给出s1 的换行符,然后在给出s2 的每三个字符后添加一个换行符。在换行符上拆分 s2 并将每次出现的三个连续空格替换为空字符串。
Split <- function(string) {
s1 <- gsub("\n", "", string)
s2 <- gsub("(.{3})", "\\1\n", s1)
spl <- strsplit(s2, "\n")
lapply(spl, function(s) replace(s, s == " ", ""))
}
# test
string <- "abc\n def\nghi jkl"
Split(string)
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
2) 在零宽度上拆分 3 char regexp 删除换行符并使用指定的正则表达式拆分。最后将每连续三个空格替换为空字符串。
Split2 <- function(string) {
s1 <- gsub("\n", "", string)
spl <- strsplit(s1, "(?<=...)", perl = TRUE)
lapply(spl, function(s) replace(s, s == " ", ""))
}
# test
string <- "abc\n def\nghi jkl"
Split2(string)
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
注意:1。请注意,提供给此问题的其他答案不适用于以下输入字符串(连续两个空字段),但此处的答案确实正确识别了 abc 字段之后连续两个空的 3 个字符字段:
string2 <- "abc\n def\nghi jkl" # 6 spaces before d, 3 spaces before j
Split(string2)
## [[1]]
## [1] "abc" "" "" "def" "ghi" "" "jkl"
Split2(string2)
## [[1]]
## [1] "abc" "" "" "def" "ghi" "" "jkl"
注意 2: 上面的两个解决方案也可以使用 magrittr 管道很好地表达:
library(magrittr)
string %>%
gsub(pattern = "\n", replacement = "") %>%
gsub(pattern = "(.{3})", replacement = "\\1\n") %>%
strsplit("\n") %>%
lapply(function(s) replace(s, s == " ", ""))
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
library(magrittr)
string %>%
gsub(pattern = "\n", replacement = "") %>%
strsplit("(?<=...)", perl = TRUE) %>%
lapply(function(s) replace(s, s == " ", ""))
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"