Regex 为什么grep还包括。和在我的文件列表中,即使它与我给出的正则表达式不匹配?

Regex 为什么grep还包括。和在我的文件列表中,即使它与我给出的正则表达式不匹配?,regex,perl,filesystems,unlink,readdir,Regex,Perl,Filesystems,Unlink,Readdir,我想做的是收集所有UTF16 Unicode图表。我从下载了所有pdf文件,并决定使用perl删除所有特殊图表或UTF32图表,并使用以下脚本: #!/usr/bin/perl opendir(my $dir, "."); my @files = grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir); for $f (@files) { print "deleting $f...\n"; #

我想做的是收集所有UTF16 Unicode图表。我从下载了所有pdf文件,并决定使用perl删除所有特殊图表或UTF32图表,并使用以下脚本:

#!/usr/bin/perl

opendir(my $dir, ".");
my @files = grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);
for $f (@files)
{
    print "deleting $f...\n";
    #unlink $f;
}
closedir($dir);
当我运行脚本时,我得到以下输出:

C:\Users\Evan\Downloads\Unicode 6.1 Charts>utf16only.pl
deleting ....
deleting .....
deleting 10FF80.pdf...
deleting ErrorLink.pdf...
deleting U10000.pdf...
deleting U100000.pdf...
deleting U10080.pdf...
deleting U10100.pdf...
deleting U10140.pdf...
deleting U10190.pdf...
deleting U101D0.pdf...
deleting U10280.pdf...
deleting U102A0.pdf...
deleting U10300.pdf...
deleting U10330.pdf...
deleting U10380.pdf...
deleting U103A0.pdf...
deleting U10400.pdf...
deleting U10450.pdf...
deleting U10480.pdf...
deleting U10800.pdf...
deleting U10840.pdf...
deleting U10900.pdf...
deleting U10920.pdf...
deleting U10980.pdf...
deleting U109A0.pdf...
deleting U10A00.pdf...
deleting U10A60.pdf...
deleting U10B00.pdf...
deleting U10B40.pdf...
deleting U10B60.pdf...
deleting U10C00.pdf...
deleting U10E60.pdf...
deleting U10FF80.pdf...
deleting U11000.pdf...
deleting U11080.pdf...
deleting U110D0.pdf...
deleting U11100.pdf...
deleting U11180.pdf...
deleting U11680.pdf...
deleting U12000.pdf...
deleting U12400.pdf...
deleting U13000.pdf...
deleting U16800.pdf...
deleting U16F00.pdf...
deleting U1B000.pdf...
deleting U1D000.pdf...
deleting U1D100.pdf...
deleting U1D200.pdf...
deleting U1D300.pdf...
deleting U1D360.pdf...
deleting U1D400.pdf...
deleting U1EE00.pdf...
deleting U1F000.pdf...
deleting U1F030.pdf...
deleting U1F0A0.pdf...
deleting U1F100.pdf...
deleting U1F200.pdf...
deleting U1F300.pdf...
deleting U1F600.pdf...
deleting U1F680.pdf...
deleting U1F700.pdf...
deleting U1FF80.pdf...
deleting U20000.pdf...
deleting U2A700.pdf...
deleting U2B740.pdf...
deleting U2F800.pdf...
deleting U2FF80.pdf...
deleting U3FF80.pdf...
deleting U4FF80.pdf...
deleting U5FF80.pdf...
deleting U6FF80.pdf...
deleting U7FF80.pdf...
deleting U8FF80.pdf...
deleting U9FF80.pdf...
deleting UAFF80.pdf...
deleting UBFF80.pdf...
deleting UBOOP.pdf...
deleting UCFF80.pdf...
deleting UDFF80.pdf...
deleting UE0000.pdf...
deleting UE0100.pdf...
deleting UEFF80.pdf...
deleting UF0000.pdf...
deleting UFFF80.pdf...
前两行仍在运行。和而且,我想因为我正在尝试取消链接,它正在删除大量我不想删除的文件。我不确定问题是出在我的regexs、grep、readdir还是unlink上,但它删除的文件比它应该删除的多。

这一行:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/}
仅包括与两个正则表达式都不匹配的文件。这包括。和要排除这两种情况,您必须扩展:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/ && !/^\.{1,2}$/}
这一行:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/}
仅包括与两个正则表达式都不匹配的文件。这包括。和要排除这两种情况,您必须扩展:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/ && !/^\.{1,2}$/}
这是你的正则表达式:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);
这表示匹配所有与U[0-9,A-F]{4}.pdf不匹配的文件注意-您真的想在其中使用逗号吗?而且不是utf16only.pl

自从。和不匹配U[0-9A-F]{4}.pdf和不匹配utf16only.pl,它们也会被删除

添加一个!/^\。/也可以将这些文件从删除列表中排除:

grep {!/^U[0-9A-F]{4}\.pdf/ && !/^\./ && !/utf16only.pl/} readdir($dir);
注意-我将您的[0-9,A-F]更改为[0-9A-F],因为我认为您的文件名中不会有逗号。

这是您的正则表达式:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);
这表示匹配所有与U[0-9,A-F]{4}.pdf不匹配的文件注意-您真的想在其中使用逗号吗?而且不是utf16only.pl

自从。和不匹配U[0-9A-F]{4}.pdf和不匹配utf16only.pl,它们也会被删除

添加一个!/^\。/也可以将这些文件从删除列表中排除:

grep {!/^U[0-9A-F]{4}\.pdf/ && !/^\./ && !/utf16only.pl/} readdir($dir);

注意-我将您的[0-9,A-F]更改为[0-9A-F],因为我认为您的文件名中不会有逗号。

当然!非常感谢!我还意识到我也应该在grep块中进行文件测试,这也会修复它。当然!非常感谢!我还意识到我也应该在grep块中进行文件测试,这也会解决它。啊,是的,感谢逗号的事情,我对perl和regex是新手,有点困惑,因为有时候regex对我来说似乎有点太聪明了。@EvanC regex永远不会比你聪明,别担心=啊,是的,谢谢你的逗号,我对perl和regex还不熟悉,有点困惑,因为有时候regex对我来说太聪明了。@EvanC regex永远都不会比你聪明,别担心=