Соответствие регулярному выражению - только если длина 4 символа и не содержит определенного слова - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время я пытаюсь создать программу, которая соответствует словам определенной длины или более, которые не содержат определенного слова.

В настоящее время у меня есть регулярное выражение: \S{4,}(?!\w*apple\w*)

При использовании на тесте: I love these delicious applestoo

Там Regex все равно будет соответствовать 'appletoo', чего я не хочу.

Я вижу, что это логическая ошибка, но я не понимаю, как еще отформатировать это регулярное выражение. Если у вас есть решение, pelase, скажите мне, спасибо заранее.

Edit:

Этот код теперь работает для моего примера: (?!\w*apple\w*)\b\S{4,}\b Однако, при использовании этого нового примера он все равно не будет работать: 'logigng some testing data _______-----apple-###zx'

Я попытался исправить это с помощью: (?!\w*(apple|_)\w*)\b\S{4,}\b, но это, похоже, не работает.

1 Ответ

2 голосов
/ 09 июля 2019

Вы ищете \b(?![^\W_]*apple)[^\W_]{4,}\b ( объяснено в regex101 )

При этом используется [^\W_] в качестве сопоставителя символов, который будет соответствовать любому символу, который не является символом, отличным от слова, и не является подчеркиванием. Это оставляет символы не подчеркивания слова, делая его похожим на [[:alnum:]] (при условии именованный класс символов POSIX * поддержка 1009 *) или [0-9A-Za-z]… если вы просто хотите использовать буквы, рассмотрите [[:alpha:]] или, просто для ASCII буквы [A-Za-z].

Отрицательная перспектива, которая следует за маркером границы слова \b по соображениям производительности, гласит, что у нас не может быть «яблока» после нуля или более из этих символов (независимо от того, что может следовать за ним). Затем мы просим сопоставить четыре или более из этих символов, а затем еще один маркер границы слова.

В следующей демонстрации командной строки я использовал grep -Po, чтобы продемонстрировать это. -P заставляет grep использовать свой интерпретатор PCRE (из libpcre), а -o заставляет его показывать только совпадения, причем каждое совпадение находится на отдельной строке:

$ echo 'logigng some testing data  _______-----apple-###zx' \
    |grep -Po '\b(?![^\W_]*apple)[^\W_]{4,}\b'
logigng
some
testing
data
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...