Странное поведение с жадными модификаторами внутри групп захвата

Рассмотрим следующие команды:

text <- "abcdEEEEfg"

sub("c.+?E", "###", text)
# [1] "ab###EEEfg"                          <<< OKAY
sub("c(.+?)E", "###", text)
# [1] "ab###EEfg"                           <<< WEIRD
sub("c(.+?)E", "###", text, perl=T)
# [1] "ab###EEEfg"                          <<< OKAY  

Первый делает именно то, что я ожидаю, в основном совпадая только с первым E. Второй должен по существу быть идентичным первому, поскольку все, что я делаю, это добавление группы захвата (хотя я не использую ее), но для некоторых причина, по которой он захватывает дополнительный E. Тем не менее, он не является полностью жадным (то есть если бы он захватил все Es). Даже более странно, это на самом деле все еще соответствует шаблону, хотя sub Результат предполагает .+? кусок опущен EE, который больше не может соответствовать остальной части регулярного выражения. Это говорит о том, что при вычислении длины сопоставленного подвыражения возникает проблема смещения, а не фактического сопоставления.

Последний точно такой же, но работает с PCRE, и это работает, как и ожидалось.

Я что-то упустил или это поведение недокументировано / глючит?

1 ответ

Решение

R использует libtre, версия 0.8. Для большей стабильности вы всегда должны использовать perl = TRUE,

Обратите внимание, что

sub("c(.+?)E?", "###", text)

работает.

Другие вопросы по тегам