исключить выражение из соответствия регулярному выражению - PullRequest
0 голосов
/ 26 сентября 2018

Я просмотрел различные страницы SO по регулярным выражениям (и многие вопросы по регулярным выражениям, связанные с отрицанием, отрицанием, исключением, фильтрацией и т. Д.), Чтобы найти решение для регулярного выражения, но пока безуспешно.

У меня есть следующий список записей:

poliester 6 blanco cod 3 xyz
pol 6 negro cod 3 abc
poliester 6 verde cod 7
pol 6 vde cod 7
pol 4 amarillo cod 3
poliester 3 zapote cod 7
poliester 6 cafe
poliester 6 negro cod 4 jpg
poliester 3 456 verde cod 3
pol 6 blanco cod 2

, из которых мне нужно получить те, которые содержат pol.* 6 .* И либо cod 3, cod 7, либо те, которые не упоминаются cod 4 или cod 2.

Многие регулярные выражения, которые я пробовал на regex101.com, заканчиваются неудачей либо потому, что они извлекают упоминание cod 4 или cod 2, либо из-за того, что им не удается получить строку poliester 6 cafe.

Ниже приведены некоторые из регулярных выражений, которые я пробовал:

pol.* 6 .*(cod [^42])
pol.* 6 .*((?!cod [^42])|cod 3|cod 7).*
pol.* 6 .*((?<!cod [^42])|cod 3|cod 7).*

Ожидаемый результат:

poliester 6 blanco cod 3 xyz
pol 6 negro cod 3 abc
poliester 6 verde cod 7
pol 6 vde cod 7
poliester 6 cafe

Пока я работаю с регулярным выражением (с использованием regex101), и я планирую впоследствии использовать его в запросе R.

1 Ответ

0 голосов
/ 26 сентября 2018

Кажется, что следующее (из описания)

pol.* 6 (?:(?=.*cod [37])|(?!.*cod [42])).*

Обратите внимание, что оно может быть эквивалентно просто

pol.* 6 (?!.*cod [42]).*

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

pol[^ ]* 6 (?!.*cod [42]).*
...