Точка является метасимволом регулярных выражений и должна быть экранирована, если вы хотите, чтобы она была буквальной точкой.Я не знаю пакет stringr
хорошо, но вот как вы можете сделать это, используя grepl
:
x <- c('us cars', 'u.s. cars', 'us and bikes', 'other')
matches <- grepl("\\bother\\b|((?=.*\\bu\\.?s\\.?(?=\\s|$))(?=.*\\bcar\\b).*)", x, perl=TRUE)
Объяснение регулярного выражения:
\\bother\\b match "other"
| OR
(
(?=.*\\bu\\.?s\\.?(?=\\s|$)) lookahead and assert that
"us" or "u.s" or "us." or "u.s." appears
(?=.*\\bcar\\b) lookahead and asser that "car" appears
.* match anything
)
Проблема сваш первоначальный шаблон таков, что вы никогда не сопоставляете что-либо на RHS чередованияНе полное исправление, но это:
regex('other|((?=.*us)(?=.*u.s.)(?=.*u.s)(?=.*car))', ignore_case=TRUE)
должно выглядеть примерно так:
regex('other|((?=.*us)(?=.*u.s.)(?=.*u.s)(?=.*car).*)', ignore_case=TRUE)
^^^ add this