将基本文件名与扩展名分开
(注意:不一定必须使用正则表达式)例如我的字符串是
my $str = "namefile.json.bz2"
我只想要主文件名 namefile
我尝试的正则表达式是^([^?=b(.bz2)b]*)
如果我的字符串(文件名不包含 b、z 或 2.
如果my $str = "bigzoom.jzon.bz2"它会失败,因为它找到了字符“b”。是否有更好的正则表达式来完全匹配.bz2?
供参考:https : //regex101.com/r/oRvMVL/1
编辑:扩展列表很多。因此,正则表达式必须匹配所有这些扩展名(以 OR 格式)例如,^([^?=b(.bz2)b | b(.json)b | b(.txt)b | b(.log)b]*)如果需要,我稍后可以更新更多扩展名。但这就是问题所在。获取没有任何扩展名的文件名。
回答
如果您想使用不是扩展名的文件名的“主要”部分,请使用这个简单的正则表达式。
# Grab everything up to the first dot character
(my $mainname) = $filename =~ m/^([^.])+/;
如果您想删除已知的文件扩展名,只需使用它。
# Remove this exact string.
$filename =~ s/.json.bz2$//i;
有关执行此操作的官方方法,请参阅File::Basename模块。
use File::Basename;
print fileparse("/foo/bar/name.json.bz2", qr/..*/);
# ---
# ("name", "/foo/bar/", ".json.bz2")
# or
print fileparse("/foo/bar/name.json.bz2", qr/.[^.]*/);
# ---
# ("name.json", "/foo/bar/", ".bz2")