3

我有一个字符串如下:

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

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

这样$str就会变成。

$str = "/dir1/dir2/dir3"

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

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

如何使正则表达式查找最后一个“/”而不是第一个。

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

请注意,file.txt不是固定名称。它可以是file1.txtfile2.txt等任何内容。

4

3 回答 3

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/\/\/\///.

于 2012-06-24T13:08:18.487 回答
3

非常简单的正则表达式:s/\/[^\/]*$//

于 2012-06-24T13:06:37.933 回答
2

在这个正则表达式中

m/(.*)\/[^\/]*$/

第一个子匹配是您要查找的路径。

编辑:

如果您正在寻找替代 user1215106 的灵魂是要走的路:

s/\/[^\/]*$//
于 2012-06-24T13:10:52.897 回答