为什么我的Perl正则表达式删除了。在文件扩展名之前?

时间:2012-04-03 16:18:39

标签: regex perl

我有这个正则表达式:

$f =~ s/[.\W_]//g;

只保留数字,字母和数字。在文件名(filename.ext)。

但是它没有在文件扩展名之前保留.(点)。如果我有:

my $f = "prn-the_rush show.jpg"

结果是prntherushshowjpg.丢失了!

我想要prntherushshow.jpg作为结果。

我该怎么做?

4 个答案:

答案 0 :(得分:7)

重写字符类以明确匹配您要保留的内容的补码:

$f =~ s/[^A-Za-z0-9.]//g;

使用tr///(a.k.a。y///),您也可以更有效地完成同样的事情:

$f =~ tr/A-Za-z0-9.//cd;

答案 1 :(得分:2)

试试这个:

$f =~ s/[^a-zA-Z0-9\.]//g;

答案 2 :(得分:2)

很多人已经为您提供了适用于您的问题的正则表达式。但是,当我遇到这些情况时,我经常最终将文件名与扩展名分开,因此我可以单独使用文件名:

my( $name, $extension ) = $filename =~ /(.+)\.([^.]+)\z/;
$name =~ s/.../.../;
my $new_filename = join '.', $name, $extension;

我经常想要rsplit这样的东西,所以我可以从右边开始将它分成有限数量的元素:

my( $name, $extension ) = rsplit /\./, $filename, 2;   # fake code

当您这样做时,如果您决定从文件名部分中删除.,则不必使用正则表达式来欺骗,以保护扩展前的最终.

答案 3 :(得分:1)

<强> 脚本:

#!/usr/bin/perl
use strict;

my $f = "prn-the_rush show.jpg ";
   $f =~ s/[^a-z\d\.]//ig;

print "$f\n";

<强> 输出:

prntherushshow.jpg