В моем домашнем каталоге у меня есть папка 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 папку drupal-6.14 , исключая все подпапки drupal-6.14 / sites / , кроме sites / all и sites / default , в который входит.
У меня вопрос к регулярному выражению:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Выражение работает для исключения всех папок, которые я хочу исключить, но я не совсем понимаю, почему.
Это обычная задача с использованием регулярных выражений для
Соответствует всем строкам, кроме тех, которые не содержат подшаблон x. Или, другими словами, отрицание подшаблона.
Я (думаю) понимаю, что общей стратегией решения этих проблем является использование негативных взглядов, но я никогда не понимал до удовлетворительного уровня, как работают позитивные и негативные взгляды (впереди / позади).
За эти годы я прочитал много сайтов на них. Руководства по регулярным выражениям PHP и Python, другие страницы, такие как http://www.regular -expressions.info / lookaround.html и т. Д., Но у меня никогда действительно не было четкого понимания их.
Может ли кто-нибудь объяснить, как это работает, и, возможно, привести несколько похожих примеров, которые бы делали подобные вещи?
- Обновление 1:
Относительно ответа Andomar: может ли двойной отрицательный прогноз быть более кратко выражен в виде одного положительного прогнозного заявления:
То есть:
'drupal-6.14/(?!sites(?!/all|/default)).*'
эквивалентно:
'drupal-6.14/(?=sites(?:/all|/default)).*'
* * ??? тысяча сорок-девять
- Обновление два:
Что касается @andomar и @alan moore - вы не можете поменять местами двойной отрицательный взгляд на положительный взгляд.