在我的主目录下,有一个名为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
这个命令的作用是压缩文件夹drupal-6.14,但排除了drupal-6.14/sites/下的所有子文件夹,只包含sites/all和sites/default。
我的问题在于正则表达式:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
这个表达式可以排除我想要排除的所有文件夹,但我不太理解为什么。
使用正则表达式来匹配所有字符串,除了那些不包含子模式x的字符串,或者换句话说,否定一个子模式,是一项常见任务。
匹配所有字符串,除了那些不包含子模式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 的说法 - 你不能将双重否定向前查看替换为正向先行断言。