Perl正则表达式匹配备用文件名

时间:2019-04-17 10:17:15

标签: regex perl

示例:

我以前使用正则表达式从文件名获取扩展名:

my $name = "file.zip";
my ($fname, $fext) = $name =~ /(.*)\.(.*)/;

# file
# zip

现在,我需要确保它也能正确捕获.tar.gz文件,以防万一名称包含它,否则请回到上面的示例。我做了以下事情:

my $name = "file.tar.gz";
my ($fname, $fext) = $name =~ /(.*)\.(tar\.gz$)|(.*)\.(.*)/;

# file
# tar.gz

问题:

问题在于,现在它仅适用于file.tar.gz,而不能像捕获file.zip这样的常规文件,并且在第二种情况下返回空。

我如何在一个正则表达式中执行此操作,因此它可以成功用于file.tar.gzfile.zip。我想念什么?

2 个答案:

答案 0 :(得分:3)

您可以使用

/^(.*?)\.(tar\.gz|[^.]*)$/

详细信息

  • ^-一行的开头
  • (.*?)-第1组:除换行符以外的任何0+个字符,并且尽可能少
  • \.-一个点
  • (tar\.gz|[^.]*)-组2:tar.gz或除点以外的任何0+字符
  • $-行尾。

请参见https://docker-py.readthedocs.io/en/stable/images.html

或者,您也可以使用原始模式,但用regex demo包裹它:

/(?|(.*)\.(tar\.gz)|(.*)\.(.*))$/

请参见branch reset group。它将为分支重置组内的相应捕获组分配相同的ID。由于将首先尝试(.*)\.(tar\.gz),所以如果存在以.tar.gz结尾的字符串,则第一个交替部分((.*)\.(tar\.gz))将匹配,否则将匹配第二个部分((.*)\.(.*))将消耗该字符串。

答案 1 :(得分:0)

perl -e '$name= "file.zip";($fname,$fext)=$name =~ /(.*)\.(tar\.gz|zip)$/ ;print "$fname.$fext"'
file.zip

捕获组的数量,即4大于分配变量($fname,$fext)=的值,即。 2 仅分配了前2个组