我有一个字符串如下:
$str = "/dir1/dir2/dir3/file.txt"
我想从此字符串中删除/file.txt 。
这样$str就会变成。
$str = "/dir1/dir2/dir3"
我正在使用以下正则表达式。但它正在取代一切。
$str =~ s/\/.*\.txt//;
如何使正则表达式查找最后一个“/”而不是第一个。
什么是正确的正则表达式?
请注意,file.txt不是固定名称。它可以是file1.txt、file2.txt等任何内容。
如果要从该字符串中获取路径,可以使用File::Basename。它是 Perl 版本 5 以来的核心模块。
perl -MFile::Basename -le '$str = "/dir2/dir3/file.txt"; print dirname($str);'
以脚本形式:
use strict;
use warnings; # always use these
use File::Basename;
my $str = "/dir1/dir2/dir3/file.txt";
print dirname($str);"
您的正则表达式不起作用,因为它没有锚定并且.*是贪婪的,所以它尽可能匹配,从/它遇到的第一个斜杠开始。一个有效的正则表达式看起来像这样:
$str =~ s#/[^/]*?\.txt$##;
请注意使用非贪婪量词*?,它将匹配尽可能小的字符串。另请注意,我使用另一个分隔符进行替换以避免“倾斜牙签综合症”,例如s/\/\/\///.
非常简单的正则表达式:s/\/[^\/]*$//
在这个正则表达式中
m/(.*)\/[^\/]*$/
第一个子匹配是您要查找的路径。
编辑:
如果您正在寻找替代 user1215106 的灵魂是要走的路:
s/\/[^\/]*$//