微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

regex – 正则表达式负前瞻

在我的主目录中,我有一个包含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

这个命令做的是gzip压缩文件夹drupal-6.14,排除drupal-6.14 / sites /除了sites / all和sites / default的所有子文件夹,它包括

我的问题是正则表达式:

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

表达式排除所有我想排除的文件夹,但我不太明白为什么。

这是使用正则表达式的常见任务

Match all strings,except those that don’t contain subpattern x. Or in other words,negating a subpattern.

我(认为)我明白解决这些问题的一般策略是使用负前瞻,但我从来没有理解到一个令人满意的水平如何正面和负面看(前/后)的工作。

多年来,我已经读了很多网站。 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 – 你不能互换双负前瞻为正前瞻。

一个负前瞻说,在这个位置,以下正则表达式不能匹配。

让我们举个简单的例子:

a(?!b(?!c))

a      Match: (?!b) succeeds
ac     Match: (?!b) succeeds
ab     No match: (?!b(?!c)) fails
abe    No match: (?!b(?!c)) fails
abc    Match: (?!b(?!c)) succeeds

最后一个例子是双重否定:它允许一个b后跟c。嵌套的负前瞻变为正前瞻:c应该存在。

在每个示例中,只有a匹配。前瞻只是一个条件,不会添加到匹配的文本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐