正则表达式匹配文件路径的子字符串

时间:2016-02-01 21:27:47

标签: regex perl

我正在尝试在Perl中编写一个与文件路径的特定部分匹配的正则表达式。

输入字符串:

/usr/local/bin/mybinary

输出必须匹配:

/usr/local/bin

我的正则表达式是:

(\ /.*\ /)

匹配/usr/local/bin/,但应删除/之后的bin

3 个答案:

答案 0 :(得分:4)

File::Basename可以为您完成此操作:

use warnings;
use strict;
use File::Basename qw(dirname);

my $in  = '/usr/local/bin/mybinary';
my $out = dirname($in);
print "$out\n";

__END__

/usr/local/bin

答案 1 :(得分:2)

如果您正在摆弄路径,强烈建议您使用Path::Tiny。它有几乎所有你想要的方法来检索绝对/相对路径名,基本名称和许多其他方法,包括父...

use Path::Tiny;
my $path = path('/usr/local/bin/mybinary');
say $path->parent; # OUTPUT: '/usr/local/bin'

更新:老人建议

我知道你说(在你对toolic的答案的评论中)你正在学习正则表达式,并且想要使用它们而不是函数。学习正则表达式的一部分也在学习它们不适合的地方,或者对问题有点过分。在这种情况下,从index 0到'{'的rindex(右索引)的路径的子字符串将更有效。

my $string = '/usr/local/bin/mybinary';
say substr($string, 0, rindex($string, '/') ); # OUTPUT: '/usr/local/bin'
# or get the child
say substr($string, rindex($string, '/') + 1); # OUTPUT: 'mybinary'

许多perl初学者使用正则表达式捕获或split使用substr以及indexrindex和/或{可以更有效地解决问题{1}}。值得学习这些字符串操作方法,这样你就可以更好地决定何时使用正则表达式。

答案 2 :(得分:1)

如果你仍然想要正则表达式    `(。*)\ /

将完成这项工作:)

https://regex101.com/r/tK4mP7/1