Perl中的负面观察断言

时间:2012-11-09 05:12:41

标签: regex perl

我有一组文件路径,我想列出所有不包含x/y/z/的文件路径。另一个限制是我不能使用print if !m{x/y/z/},因为我没有脚本的写权限。我可以为脚本提供正则表达式模式到 include (作为命令行选项),即匹配的所有内容都将打印出来。

这是我的尝试。我正在尝试匹配之前有x/y/z/的所有行。

#!/usr/bin/perl
use warnings;
use strict;

while(<DATA>) {
   print if m{(?<!x/y/z/).*};
}

__DATA__
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/a/b/m.cc
x/y/a/b/m.cc

我的期望是它只打印最后两个字符串,但它会打印所有内容。但是当我将模式更改为(?<=x/y/z/).*时,它只打印前3个字符串:

x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc

为什么会这样,我该怎么做才能修复我的正则表达式?

1 个答案:

答案 0 :(得分:4)

您需要的是否定前瞻。所以,直接从the monastery得出答案:

#!/usr/bin/perl
use warnings;
use strict;

while(<DATA>) {
   print if m{^(?!(?s:.*)x/y/z)}; 
}

__DATA__
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/a/b/m.cc
x/y/a/b/m.cc