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