我怎么能得到这个正则表达式语句来捕获一个选择件

时间:2011-04-03 07:02:52

标签: regex perl

我试图在这个循环中获得正则表达式,

my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /(.+\.vmsn)/xm;
print "$1\n";
}

从此行捕获文件名,

./vmfs/volumes/4cbcad5b-b51efa39-c3d8-001517585013/MX01/MX01-Snapshot9.vmsn

我想要的唯一部分是部分是实际的文件名,而不是路径。

我尝试使用$锚定到行尾的表达式,但这似乎没有任何区别。我还尝试使用2个.+输入,一个在捕获组之前,另一个在捕获组内。再一次没有运气,对我来说也觉得有点混乱,所以我不想那样做,除非我必须这样做。

我知道如何在最后/到行尾之后只获取文件名吗?

可以根据需要添加更多内容,我不确定我需要发布什么来提供足够的信息。

- 更新 -

经过5分钟的修补,我似乎已经弄明白了。 (多么令人惊讶)

所以现在我离开了这个,(并且它有效)

my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /.+\/(\w+\-Snapshot\d+\.vmsn)/xm;
print "$1\n";
}

反正是为了让这更好吗?

2 个答案:

答案 0 :(得分:2)

可能最好的方法是使用核心模块File::Basename。这将使您的代码最便携。

如果您真的想使用正则表达式并且基于Unix,那么您可以使用:

$vmsn =~ m%.*/([^/]+)$%;
$file = $1;

答案 1 :(得分:1)

好吧,如果您打算从shell中使用find命令,并且考虑到您声明只需要文件名,为什么不呢?

... $ssh->capture("find -name $vmsn_file -printf \"%f\n\" ");

如果没有,最简单的方法是split() "/"上的字符串,然后获取最后一个元素。不需要太长或太复杂的正则表达式。

有关使用情况的详情,请参阅perldoc -f split