我有一个字符串如下:
$str = "/dir1/dir2/dir3/file.txt"
我想从此字符串中删除 /file.txt 。
这样 $ str 就会变成。
$str = "/dir1/dir2/dir3"
我正在使用以下正则表达式。但它正在取代一切。
$str =~ s/\/.*\.txt//;
如何让正则表达式查找最后的'/'而不是第一个。
这是正确的正则表达式是什么?
请注意 file.txt 不是固定名称。它可以是 file1.txt , file2.txt 等。
答案 0 :(得分:6)
如果您想从该字符串获取路径,可以使用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/\/\/\///
。
答案 1 :(得分:3)
非常简单的正则表达式:s/\/[^\/]*$//
答案 2 :(得分:2)
在这个正则表达式中
m/(.*)\/[^\/]*$/
第一个子匹配是您要查找的路径。
修改强>
如果您正在寻找替代用户1215106的灵魂是要走的路:
s/\/[^\/]*$//