【问题标题】:Pattern matching perl模式匹配 perl
【发布时间】:2020-06-22 12:42:34
【问题描述】:

我正在尝试在文件夹中搜索与此条件 *_abc_*.txt 匹配的任何文件。我知道我的正则表达式使用是错误的,但不知何故我不知道如何解决。提前致谢。

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>

  }
}

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    * 在正则表达式中的含义与在 shell glob 中的含义不同。它们相似,但不一样。

    * 表示前面的匹配出现零次或多次。所以\ * 匹配零个或多个空格。 _* 匹配零个或多个下划线。因此,glob 中的 * 在功能上等同于正则表达式中的 .*

    虽然我可以指出如何修复正则表达式,但我认为更好的答案是首先使用 glob

    foreach my $filepath ( glob ( "$dir/*_abc_*.txt" ) ) {
      # do something
    } 
    

    首先不要尝试正则表达式匹配。

    【讨论】:

    • Nit: Regex .* 仅在使用 /s 时等效于 glob *
    • 代码注入错误。 "$dir/*_abc_*.txt" 应该是 "\Q$dir\E/*_abc_*.txt"。对于包含空格和其他字符的路径,您的版本将失败,这是我机器上(绝对)路径的重要部分。
    【解决方案2】:
    opendir my $dh, $dir or die "can't open directory:$!";
    while (my $entry = readdir $dh){
      if($entry !~ m{(.*?)\_abc\_(.*?)\.txt$}i){
        print $entry,"\n";
      }
    }
    

    试试上面的。它会锻炼。

    【讨论】:

    • 您不应该将$ 替换为\z\z 是要使用的正确原子。
    • 请注意,_ 不需要转义。
    • 谢谢。我尝试了这个并将 $ 更改为 \z。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多