Rozsądek i poczytalność-check użyciu gregexpr()
wskazują, że wygląd opóźnieniem i antycypowana twierdzeń poniżej powinny każdy mecz na dokładnie jeden lokalizacja w testString
:Dlaczego funkcja strsplit używa pozytywnej asysty z wyprzedzeniem i asymilacji lookbehind w inny sposób?
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()
jednak wykorzystuje te lokalizacje meczu inaczej, podział testString
na jedno miejsce podczas korzystania z asercji lookbehind, ale w przypadku dwóch lokalizacji - z których druga wydaje się niepoprawna - podczas korzystania z asercji przewidującej.
strsplit(testString, BB, perl=TRUE)
# [[1]]
# [1] "text XX " "text"
strsplit(testString, FF, perl=TRUE)
# [[1]]
# [1] "text" " " "XX text"
Mam dwa pytania: (Q1) Co tu się dzieje? I (Q2) jak można uzyskać strsplit()
, aby lepiej się zachowywać?
Aktualizacja: doskonała odpowiedź Theodore Lytras wyjaśnia, co się dzieje, a więc odnosi (Q1). Moja odpowiedź opiera się na jego identyfikacji środka zaradczego, adresując: (Q2).
FYI , jest trochę związana dyskusja o tym, dlaczego 'stringr :: str_split' zachowuje się inaczej niż' strsplit' na https://github.com/hadley/stringr/pull/23 – hadley