【发布时间】:2013-03-12 14:20:35
【问题描述】:
常识和使用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() 以不同的方式使用这些匹配位置,当使用后向断言时,testString 在 一个 位置拆分,但在 两个 位置 - 第二个其中似乎不正确——使用前瞻断言时。
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的行为不同github.com/hadley/stringr/pull/23 有一个相关的讨论