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

标签 regex perl

我有一个字符串如下:

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

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

这样$str就会变成。

$str = "/dir1/dir2/dir3"

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

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

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

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

请注意,file.txt不是固定名称。它可以是 file1.txtfile2.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/

相关文章:

c++ - regex_search 和子串匹配

perl - 从 DBIx::Class 中的 has_many 关系中检索数据

multithreading - 在 Perl 中,如何使用多个线程来处理大型数组的一部分?

python - Python LDAP查询的过滤结果

javascript - URL 字符串的正则表达式模式

ruby - 在 Ruby 的正则表达式中,前瞻和后视概念如何支持这种零宽度断言概念?

mysql - 指定连接Mysql的源IP

perl - Perl 中的 Substr,将 utf8 字符切成两半

multithreading - 从 perl 线程生成 Expect

javascript - 从字符串中获取价格