Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从压缩文件中获取原始文件名_Regex_Perl - Fatal编程技术网

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

Regex 从压缩文件中获取原始文件名,regex,perl,Regex,Perl,我已压缩文件名,如: filename1.csv.Z filename2.csv.gz 我有用于获取最后一个扩展名的正则表达式: my ($ext) = $file =~ /(\.[^.]+)$/; 现在我想获得原始文件名,不带.Z或.gz,例如filename1.csv、filename2.csv 我试着使用下面的expresion之类的东西,但不起作用 my ($output) = $file =~ /.+?(?=(([^.]+)$))/; 有人能帮我吗?在你的模式中。+??=[^.]

我已压缩文件名,如:

filename1.csv.Z
filename2.csv.gz
我有用于获取最后一个扩展名的正则表达式:

my ($ext) = $file =~ /(\.[^.]+)$/;
现在我想获得原始文件名,不带.Z或.gz,例如filename1.csv、filename2.csv

我试着使用下面的expresion之类的东西,但不起作用

my ($output) = $file =~ /.+?(?=(([^.]+)$))/;
有人能帮我吗?

在你的模式中。+??=[^.]+$你断言右边的是1+倍,不是一个点,后面是字符串的结尾

这个断言可能在多个地方都是正确的,还将包括匹配点本身

例如,在filename2.csv.gz中,将匹配filename2.csv。和g

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

.+(?=\.[^.]+$)
(.+)\.[^.]+$
或者使用捕获组和匹配,而不是前瞻:

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

比如说

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

# filename1.csv
在您的模式中。+??=[^.]+$您断言直接在右边的是1+倍,而不是后跟字符串末尾的点

这个断言可能在多个地方都是正确的,还将包括匹配点本身

例如,在filename2.csv.gz中,将匹配filename2.csv。和g

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

.+(?=\.[^.]+$)
(.+)\.[^.]+$
或者使用捕获组和匹配,而不是前瞻:

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

比如说

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

# filename1.csv

了解您的标准库。见:


了解您的标准库。见:


如果这是匹配项\.[^.]+$您可以用空字符串替换它,或者使用捕获组。+?\.[^.]+$也许删除已知后缀就足够了$file=~s/\.?:Z | gz$/?@Wiktor Stribiżew my$output=$file=~s/\.?:Z | gz$/;打印$输出;返回1。我在这里做错了什么吗?请参阅。如果这是匹配\.[^.]+$您可以将其替换为空字符串或使用捕获组。+?\.[^.]+$也许删除已知后缀就足够了$file=~s/\.?:Z | gz$/?@Wiktor Stribiżew my$output=$file=~s/\.?:Z | gz$/;打印$输出;返回1。我做错什么了吗?看。