我有这个正则表达式:
$f =~ s/[.\W_]//g;
只保留数字,字母和数字。在文件名(filename.ext)。
但是它没有在文件扩展名之前保留.
(点)。如果我有:
my $f = "prn-the_rush show.jpg"
结果是prntherushshowjpg
但.
丢失了!
我想要prntherushshow.jpg
作为结果。
我该怎么做?
答案 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