2015-07-21 5 views
3

Я пытаюсь использовать регулярное выражение в R:Invalid регулярное выражение в R

\?(?=([^'\\]*(\\.|'([^'\\]*\\.)*[^'\\]*'))*[^']*$)

Я спасаясь так:

\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)

я получаю invalid regexp ошибку.

Regexpal не имеет проблем с регулярным выражением, и я проверил, что интерпретируемое регулярное выражение в сообщении об ошибке R совпадает с тем, что я использую в приятеле Regex, поэтому я как бы не понимаю. Я не думаю, что побег - это проблема.

Код:

output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)", "!", "This is a test string?") 
+2

Просто установите 'T <- 0 '(как это может быть написано кем-то настраивают моделирования для анализа выживаемости) , и посмотреть, что произойдет. (Затем попробуйте 'TRUE <- 0') –

ответ

4

R по умолчанию использует POSIX (P ortable O perating S ystem I nterface) стандарт регулярных выражений (см эти SO сообщения [1, 2 ] и ?regex [caveat emptor: плотность уровня мачете на уровне]].

Посмотрите вперед ((?=...)), смотрите-за ((?<=...)) и их отрицаний ((?!...) и (?<!...)), вероятно, наиболее характерные примеры PCRE Определённые (P erl- C ompatible RРегулярная E xpressions), которые не совместимы с POSIX.

R можно обучить понимать ваше регулярное выражение, активировав опцию perl на TRUE; эта опция доступна во всех base регулярных выражениях функций (gsub, grepl, regmatches и т.д.):

output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)", 
       "!", "This is a test string?", perl = TRUE) 
Смежные вопросы