2010-03-18 125 views

回答

38
my $file = "test.exe"; 

# Match a dot, followed by any number of non-dots until the 
# end of the line. 
my ($ext) = $file =~ /(\.[^.]+)$/; 

print "$ext\n"; 
4
\.[^\.]*$ 

这会给你最后一个点(包括点本身)之后的所有内容,直到字符串结束。

3

你可以使用File::Basename提取任意文件扩展名:

use strict; 
use warnings; 
use File::Basename; 
my $ext = (fileparse("/foo/bar/baz.exe", qr/\.[^.]*/))[2]; 
print "$ext"; 
12

使用文件::基名

use File::Basename; 
    ($name,$path,$suffix) = fileparse("test.exe.bat",qr"\..[^.]*$"); 
    print $suffix; 
+2

我从来没有想过File :: Basename对于这个工作是有好处的,因为你必须提供你可以用匹配运算符来完成相同事情的模式。 – 2010-03-18 03:58:03

+2

如果它只是为了获得扩展,一个正常的正则表达式就足够了。但是File :: Basename也会解析路径的其余部分。如果OP需要除扩展需要以外还有它们,File :: Basename派上用场。 – ghostdog74 2010-03-18 04:39:17

+0

警告:我有用户命名为'filename..doc'的文件,上面后缀的regep将作为扩展名返回'..doc'。如果按照这个方向进行,则优先选择@toolic回复中的一个(或者文件:Basename的Perl文档)。 – 2013-10-10 16:17:35

3

这是一个正则表达式匹配模式n级扩展文件(例如,.tar.gz.tar.bz2)。

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

例子:

#!/usr/bin/perl 

my $file1 = "filename.tar.gz.bak"; 
my ($ext1) = $file1 =~ /((\.[^.\s]+)+)$/; 

my $file2 = "filename.exe"; 
my ($ext2) = $file2 =~ /((\.[^.\s]+)+)$/; 

my $file3 = "filename. exe"; 
my ($ext3) = $file3 =~ /((\.[^.\s]+)+)$/; 

my $file4 = "filename.............doc"; 
my ($ext4) = $file4 =~ /((\.[^.\s]+)+)$/; 

print "1) $ext1\n"; # prints "1) .tar.gz.bak" 
print "2) $ext2\n"; # prints "2) .exe" 
print "3) $ext3\n"; # prints "3) " 
print "4) $ext4\n"; # prints "4) .doc" 
相关问题