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 за ссылку.)