В моем домашнем каталоге у меня есть папка drupal-6.14, которая содержит платформу Drupal.Регулярное выражение negative lookahead
Из этого каталога я использую следующую команду:
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)).*'
Выражение работает исключить все папки я хочу исключенных, но я не совсем понимаю, почему.
Это общая задача с использованием регулярных выражений
Матчем всех строк, кроме тех, которые не содержат подшаблоны х. Или, другими словами, отрицание подшаблона.
Я (думаю) Я понимаю, что общая стратегия для решения этих проблем является использование отрицательных lookaheads, но я никогда не понимал, на удовлетворительном уровне, как положительный и отрицательный взгляд (вперед/сзади) с работы.
На протяжении многих лет я читал на них множество веб-сайтов. Руководства по регулярному выражению PHP и Python, другие страницы, такие как http://www.regular-expressions.info/lookaround.html и т. Д., Но у меня никогда не было действительно имел полное представление о них.
Может ли кто-нибудь объяснить, как это работает, и, возможно, предоставить некоторые аналогичные примеры, которые будут делать подобные вещи?
- Обновление One:
Что касается ответа Andomar в: может двойное отрицание опережения быть более кратко выражается в виде одного положительного заявления опережения:
ИЭ:
'drupal-6.14/(?!sites(?!/all|/default)).*'
эквивалентно:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Обновление Два:
По @andomar и @alan МУР - вы не можете поменять местами двойной отрицательный предпросмотр для положительного опережающего просмотра.
Если вложенный негативный взгляд («двойной отрицательный взгляд») может стать положительным взглядом, можно ли представить эквивалент в форме положительного вида? i.e: (a) Какова была бы положительная обратная форма моего двойного отрицательного внешнего вида drupal "'drupal-6.14/(! sites (?!/all |/default)). *'" example? Будет ли это: 'drupal-6.14/(? = Sites/all | default). * ??? (б) Какова была бы положительная обратная форма вашего двойного негативного взгляда "(!? B (?! C))" пример? – themesandmodules
eww. Прости. первый раз, используя комментарии здесь, что форматирование ужасно. плохо отредактируйте вопрос. – themesandmodules
@willieseabrook: Не думайте так, только часть взгляда двойная отрицательная, поэтому вы не можете заменить целое положительным – Andomar