在我的主目录中,我有一个包含 Drupal 平台的文件夹 drupal-6.14。
在此目录中,我使用以下命令:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
该命令的作用是压缩文件夹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等等,但我从来没有真正对它们有过深入的了解。
有人可以解释一下这是如何工作的,也许可以提供一些类似的例子来做类似的事情?
-- 更新一:
关于 Andomar 的回应:双否定前瞻能否更简洁地表示为单个肯定前瞻语句:
即是:
'drupal-6.14/(?!sites(?!/all|/default)).*'
相当于:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
-- 更新二:
根据@andomar 和@alan moore - 您不能将双负前瞻互换为正前瞻。