Регулярное выражение отрицательный взгляд

В моем домашнем каталоге у меня есть папка drupal-6.14, которая содержит платформу Drupal.

Из этого каталога я использую следующую команду:

find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz

Эта команда делает gzips папкуДрупал-6,14, исключая все подпапкиДрупал-6,14 / сайтов / кроме сайтов / всех и сайтов / по умолчанию, который включает в себя.

Мой вопрос по регулярному выражению:

grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'

Выражениеработает чтобы исключить все папки, которые я хочу исключить, но я не совсем понимаю, почему.

Это обычная задача с использованием регулярных выражений для

Сопоставить все строки, кроме тех, которыене содержать подшаблон х. Или, другими словами, отрицание подшаблона.

Я (думаю) понимаю, что общей стратегией решения этих проблем является использование негативных взглядов, но я никогда не понимал до удовлетворительного уровня, как работают позитивные и негативные взгляды (впереди / позади).

За эти годы я прочитал много сайтов на них. Руководства по регулярным выражениям PHP и Python, другие страницы, такие какhttp://www.regular-expressions.info/lookaround.html и так далее, но я никогдадействительно имел твердое понимание их.

Может ли кто-нибудь объяснить, как это работает, и, возможно, привести несколько похожих примеров, которые бы делали подобные вещи?

- Обновите один:

Относительно ответа Andomar: может ли двойной отрицательный прогноз быть более кратко выражен в виде одного положительного прогнозного заявления:

то есть

'drupal-6.14/(?!sites(?!/all|/default)).*'

эквивалентно:

'drupal-6.14/(?=sites(?:/all|/default)).*'

???

- Обновление два:

Что касается @andomar и @alan moore - вы не можете поменять местами двойной отрицательный взгляд на положительный взгляд.

Ответы на вопрос(3)

Ваш ответ на вопрос