R
по умолчанию использует стандарт регулярных выражений POSIX
(Portable Operating System Interface) (см. эти сообщения SO [ 1 , 2 ] и ?regex
[ caveat emptor : плотность уровня мачете]].
Взгляд вперед ((?=...)
), look-behind ((?<=...)
) и их отрицания ((?!...)
] и (?), вероятно, являются наиболее яркими примерами форматов
PCRE
-специфических (Perl-совместимых регулярных выражений), которые не совместимы с POSIX
.
R
можно обучить понять ваше регулярное выражение, активировав опцию perl
на TRUE
; эта опция доступна во всех функциях регулярного выражения base
(gsub
, grepl
, regmatches
и т. д.):
output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)",
"!", "This is a test string?", perl = TRUE)