我以前使用正则表达式从文件名获取扩展名:
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.gz
和file.zip
。我想念什么?
答案 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个组