从压缩文件中获取原始文件名

时间:2019-10-18 10:23:56

标签: regex perl

我的压缩文件名为:

filename1.csv.Z
filename2.csv.gz

我有用于最后扩展名的正则表达式:

my ($ext) = $file =~ /(\.[^.]+)$/;

现在,我想获取“原始文件名”,而不包含.Z或.gz。 filename1.csv,filename2.csv

我尝试在下面使用类似expresion的方法,但是不起作用...

my ($output) = $file =~ /.+?(?=(([^.]+)$))/;

有人会帮我吗?

2 个答案:

答案 0 :(得分:6)

了解您的标准库。参见File::Basename

use File::Basename qw(basename);
for my $fullname (qw(filename1.csv.Z filename2.csv.gz)) {
    my $basename = basename $fullname, qw(.Z .gz);
}
__END__
filename1.csv
filename2.csv

答案 1 :(得分:0)

在模式.+?(?=[^.]+$)中,您断言右边的直接是1+乘以一个点,然后是字符串的结尾。

该断言在多个地方可能是正确的,并且还将包括匹配点本身。

例如在filename2.csv.gz中将与filename2.csv.g匹配的

如果只想获取示例数据中文件名的匹配项,则可以在正向前行中添加点:

.+(?=\.[^.]+$)

Regex demo

或者使用捕获组和匹配项来代替前瞻:

(.+)\.[^.]+$

Regex demo | Perl demo

例如

my $line = "filename1.csv.Z";
my ($output) = $line =~ m/(.+)\.[^.]+$/;
print $output;

# filename1.csv