我有一个字符串如下:
$str = "/dir1/dir2/dir3/file.txt"
我想从此字符串中删除 /file.txt。
这样$str就会变成。
$str = "/dir1/dir2/dir3"
我正在使用以下正则表达式。但它正在取代一切。
$str =~ s/\/.*\.txt//;
如何使正则表达式查找最后一个 '/' 而不是第一个。
正确的正则表达式是什么?
请注意,file.txt不是固定名称。它可以是 file1.txt、file2.txt 等任何内容。
最佳答案
如果你想从该字符串获取路径,可以使用 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/\/\/\///
。
关于regex - Perl 正则表达式替换最后一个匹配的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11177653/