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

时间:2012-06-24 13:01:24

标签: regex perl

我有一个字符串如下:

$str = "/dir1/dir2/dir3/file.txt"

我想从此字符串中删除 /file.txt

这样 $ str 就会变成。

$str = "/dir1/dir2/dir3"

我正在使用以下正则表达式。但它正在取代一切。

$str =~ s/\/.*\.txt//;

如何让正则表达式查找最后的'/'而不是第一个。

这是正确的正则表达式是什么?

请注意 file.txt 不是固定名称。它可以是 file1.txt file2.txt 等。

3 个答案:

答案 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/\/[^\/]*$//