Regex 模式匹配perl
我试图在文件夹中搜索与此条件匹配的任何文件。我知道我的正则表达式用法是错误的,但不知何故我不知道如何修复。提前谢谢Regex 模式匹配perl,regex,perl,Regex,Perl,我试图在文件夹中搜索与此条件匹配的任何文件。我知道我的正则表达式用法是错误的,但不知何故我不知道如何修复。提前谢谢 chdir $dir; opendir my $dh, $dir or die "can't open directory:$!"; while (my $entry = readdir $dh){ if($entry !~ m{\ *?_abc_*?[.]txt\z}x){ <do_something> } } chdir$di
chdir $dir;
opendir my $dh, $dir or die "can't open directory:$!";
while (my $entry = readdir $dh){
if($entry !~ m{\ *?_abc_*?[.]txt\z}x){
<do_something>
}
}
chdir$dir;
opendir my$dh、$dir或die“无法打开目录:$!”;
while(my$entry=readdir$dh){
if($entry!~m{\*?\u abc_*?[.]txt\z}x){
}
}
*
在regex中的含义与在shell globs中的含义不同。它们很相似,但不一样
*
表示前面匹配的出现次数为零或更多。因此,\*
匹配零个或多个空格<代码>.*匹配零个或多个下划线。因此glob中的*
在功能上等同于regex中的*
虽然我可以告诉您如何修复正则表达式,但我认为更好的答案是首先使用glob
:
foreach my $filepath ( glob ( "$dir/*_abc_*.txt" ) ) {
# do something
}
而不是一开始就尝试和regex匹配
opendir my $dh, $dir or die "can't open directory:$!";
while (my $entry = readdir $dh){
if($entry !~ m{(.*?)\_abc\_(.*?)\.txt$}i){
print $entry,"\n";
}
}
试试上面的方法。当使用
/s
时,Nit:Regex*
仅等同于glob*
。代码注入错误“$dir/*\u abc.*.txt”
应该是“\Q$dir\E/*\u abc.*.txt”
。对于包含空格和其他字符的路径,您的版本将失败,这是我的计算机上(绝对)路径的很大一部分。您不应该将$
替换为\z
\z
是正确使用的atom。请注意,不需要转义。
谢谢。我试过了,并将$更改为\z。效果很好。