Как сократить выражение «не содержать несколько строк» ​​в каждом условии условия. регулярное выражение R - PullRequest
0 голосов
/ 23 января 2020

Я должен обнаружить, что строки содержат несколько шаблонов слов, но также не могут содержать несколько шаблонов слов

Данные:

tt <- c("apple","banana","orange","appleZ","appleX","bananaZ","orangeY") 

Цель: grep только без Z, X, Y

[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

Проблема: слишком длинные сценарии для повторения (?![X|Y|Z]) в каждом содержащем шаблоне

stri_detect_regex(tt,"apple(?![X|Y|Z])|banana(?![X|Y|Z])|orange(?![X|Y|Z])")

У нас есть какой-нибудь другой красивый способ упростить сценарий?

Ответы [ 2 ]

4 голосов
/ 23 января 2020

Вы можете использовать grepl

grepl('^[^XYZ]+$', tt)
#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

Возвращает TRUE, если в строке нет ни одного из X, Y или Z.

2 голосов
/ 23 января 2020

Вы можете использовать группу без захвата

(?:apple|banana|orange)(?![XYZ])

Regex Demo

PS: - Если вы хотите соответствовать |, то только | внутри [] ( character class ) имеет смысл, даже тогда нет необходимости повторять их, если вы намеревались использовать его для чередования, тогда вам не нужно | внутри [] ( character class )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...