I have a string like this:
s <- "aaehhhhhhhaannd"
我该如何使用R将字符串拆分为以下格式?
c("aa", "e", "hhhhhhh", "aa","nn","d")
str_extract_all
函数,正则表达式为 (.)\\1*
,它使用反向引用来匹配重复字符:library(stringr)
str_extract_all("aaehhhhhhhaannd", "(.)\\1*")
#[[1]]
#[1] "aa" "e" "hhhhhhh" "aa" "nn" "d"
strsplit
和基于环视的PCRE正则表达式。s <- "aaehhhhhhhaannd"
strsplit(s, "(?<=(.))(?!\\1)", perl=TRUE)
# [[1]]
# [1] "aa" "e" "hhhhhhh" "aa" "nn" "d"
正则表达式细节:
(?<=(.))
- 一个正向后瞻((?<=...)
)会“查看”左侧,并使用(.)
捕获组将任何字符捕获到第1组中(可以通过\1
反向引用在模式内引用此值)(?!\\1)
- 一个负向前瞻,如果当前位置右侧有与第1组中捕获的相同值,则匹配失败。由于前后瞻不消耗文本,因此分割发生在不同字符之间的位置。
注意:如果你希望.
匹配换行符,需要在模式开头加上(?s)
(与PCRE正则表达式类似,默认情况下.
不会匹配换行符)。