Perl正则表达式替换最后匹配的字符串

Ano*_*eek 3 regex perl

我有一个字符串如下:

$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等.

TLP*_*TLP 6

如果要从该字符串获取路径,可以使用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/\/\/\///.

  • 像往常一样好的代码和良好的建议.但有时我喜欢使用`rindex($ str,'/')`. (3认同)