Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl中的否定查找断言_Regex_Perl - Fatal编程技术网

Regex Perl中的否定查找断言

Regex Perl中的否定查找断言,regex,perl,Regex,Perl,我有一组文件路径,我想列出所有不包含x/y/z/的文件路径。另一个限制是我不能使用print if!m{x/y/z/}因为我没有脚本的写入权限。我可以为脚本提供要包含的regexp模式(作为命令行选项),即,匹配的所有内容都将被打印出来 这是我的尝试。我正在尝试匹配前面没有x/y/z/的所有行 #!/usr/bin/perl use warnings; use strict; while(<DATA>) { print if m{(?<!x/y/z/).*}; } _

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

这是我的尝试。我正在尝试匹配前面没有
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

为什么会这样,我应该怎么做来修复我的regexp?

您需要的是一个负前瞻。因此,答案直接来自:

#!/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
#/usr/bin/perl
使用警告;
严格使用;
while(){
如果m{^(?(?s:.*)x/y/z},则打印;
}
__资料__
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

literal translation:匹配一个字符串,该字符串不以任何数量的字符开头,后跟
x/y/z
您真的想过滤掉
x/y/zoo/a.cc
<需要添加代码>/或
(?:/\z)
。不,我不想筛选出
x/y/zoo
。应过滤
x/y/z/
下的所有内容。让我适当地编辑这个问题。
m{(?matches
x/y/z/a/b/x.cc
因为
m{(?matches
/y/z/a/b/x.cc
#!/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