Strsplit несовместим с gregexpr
Комментарий по моему отвечу на этот вопрос, который должен дать желаемый результат с использованием strsplit
не работает, хотя он, кажется, правильно соответствует первой и последней запятыми в символьном векторе. Это можно доказать, используя gregexpr
и regmatches
.
Итак, почему strsplit
разбивается на каждую запятую в этом примере, хотя regmatches
возвращает только два совпадения для одного и того же регулярного выражения?
# We would like to split on the first comma and
# the last comma (positions 4 and 13 in this string)
x <- "123,34,56,78,90"
# Splits on every comma. Must be wrong.
strsplit( x , '^\\w+\\K,|,(?=\\w+$)' , perl = TRUE )[[1]]
#[1] "123" "34" "56" "78" "90"
# Ok. Let check the positions of matches for this regex
m <- gregexpr( '^\\w+\\K,|,(?=\\w+$)' , x , perl = TRUE )
# Matching positions are at
unlist(m)
[1] 4 13
# And extracting them...
regmatches( x , m )
[[1]]
[1] "," ","
Да?! Что происходит?
Ответы
Ответ 1
Теория @Aprillion точна, из документация R:
Алгоритм, применяемый к каждой входной строке,
repeat {
if the string is empty
break.
if there is a match
add the string to the left of the match to the output.
remove the match and all to the left of it.
else
add the string to the output.
break.
}
Другими словами, на каждой итерации ^
будет соответствовать начало новой строки (без элементов прецедента.)
Чтобы просто проиллюстрировать это поведение:
> x <- "12345"
> strsplit( x , "^." , perl = TRUE )
[[1]]
[1] "" "" "" "" ""
Здесь, вы можете увидеть следствие этого поведения с утверждением lookahead как разделителем (Спасибо @JoshO'Brien за ссылку.)