正则表达式修剪路径到最后一个文件夹和文件

时间:2011-12-21 16:05:18

标签: regex perl

我拥有的是:

E:\folder\00000000\file.txt

我希望得到这个:

00000000\file.txt

问题是我循环遍历这些目录的列表并需要为每个目录删除它,而不仅仅是00000000目录,因为下一个是00000001,所以一个

我想出的正则表达式是:

.+\\00000000    

让我这样:

\file.txt

任何想法都会很棒!

谢谢!

更新:废话!我搞砸了......

我想要捕捉的是与此相反的:

E:\folder\

所以我可以用不同的路径替换它。对不起: - /

4 个答案:

答案 0 :(得分:6)

此模式可用:[^\\]+\\[^\\]+$

它说:任意数量的非正斜杠字符,然后是正斜杠,然后是更多非正斜杠,以及输入或行的结束。

答案 1 :(得分:2)

你正在处理路径。使用旨在处理路径的函数。

#!/usr/bin/env perl

use strict; use warnings;

use Path::Class;

my $path = Path::Class::File->new_foreign(
    Win32 => 'E:\folder\00000000\file.txt'
);

my $top = dir($path->volume, $path->parent->dir_list(0, 2));

print "$top\n";

输出:

C:\Temp> t
E:\folder

答案 2 :(得分:0)

尝试\\([^\\]+\\[^\\]+)$并抓住$1 / \1

分解为:

  • 反斜杠;
  • 保持:
    • 至少1个非反斜杠;
    • 反斜杠;
    • 至少1个非反斜杠;
  • 字符串结尾

N.B。即使你在Windows上,你仍然可以在文件名中使用标准斜杠,所以如果你无法控制传入文件名的格式,你可能想要使用:

 [\\\/]([^\\\/]+\\[^\\\/]+)$

...因为它会接受\/作为路径分隔符。

答案 3 :(得分:0)

不要修剪,匹配!

$path = "E:\\folder\\00000000\\file.txt";
if ($path =~ /(\d+\\.*)$/) {  
    $result = $1;
    print $result;
} else {
    print "bad";
}