常识和使用gregexpr()
进行的合理性检查表明,下面的顾前顾后断言应该在testString
中各匹配一次:
testString <- "text XX text"
BB <- "(?<= XX )"
FF <- "(?= XX )"
as.vector(gregexpr(BB, testString, perl=TRUE)[[1]])
# [1] 9
as.vector(gregexpr(FF, testString, perl=TRUE)[[1]][1])
# [1] 5
strsplit()
使用这些匹配位置来不同的方式,如果使用lookbehind断言,则在一个位置分割testString
,但是如果使用lookahead断言,则在两个位置分割,第二个位置似乎不正确。
strsplit(testString, BB, perl=TRUE)
# [[1]]
# [1] "text XX " "text"
strsplit(testString, FF, perl=TRUE)
# [[1]]
# [1] "text" " " "XX text"
我有两个问题:(Q1) 这里发生了什么?以及 (Q2) 如何使strsplit()
行为更佳?
更新:Theodore Lytras的出色回答解释了发生了什么,因此解决了(Q1)。我的答案建立在他的基础之上,提出了一种解决方法,解决了(Q2)。
stringr::str_split
的行为与strsplit
不同,有一个相关的讨论在https://github.com/hadley/stringr/pull/23。 - hadley