2016-03-09 2 views
7

У меня есть очень специальный вопрос, касающийся регулярных выражений в R:регулярное выражение: "(^ |)" против "(| ^)"

grepl("(|^)over","stackoverflow") 
# [1] TRUE 

grepl("(^|)over","stackoverflow") 
# [1] FALSE 

grepl("(^|x|)over","stackoverflow") 
# [1] FALSE 

grepl("(x|^|)over","stackoverflow") 
# [1] FALSE 

grepl("(x||^)over","stackoverflow") 
# [1] TRUE 

Почему все эти выражения не оценить в TRUE?

+4

не уверен, почему для библиотеки по умолчанию (POSIX 1003.2 расширенные регулярные выражения), но работает, как ожидалось с PCRE 'grepl ("(^ |) над", "StackOverflow", PERL = TRUE) ' – rawr

ответ

6

POSIX регулярные выражения на самом деле должно сделать все это True. Похоже, что R uses a slightly modified version из Ville Laurikari's TRE library, который не совсем соответствует стандарту. Я буду следовать рекомендациям @ rawr и использовать perl = TRUE для более совместимых регулярных выражений.

Смотрите также: When both halves of an OR regex group match, is it defined which will be chosen?

+4

R использует реализацию TRE POSIX ERE по умолчанию и тип PERL по опции: https://github.com/laurikari/tre –

+0

Ницца! Я обновил ответ. –

Смежные вопросы