2014-11-02 110 views
0

我想根据给定的目录路径分割出一个目录,并与perl中的默认目录进行比较,最好是在正则表达式中。我有两个默认目录,可以说/ root/demo /和/ etc/demo /。基于默认目录确定目录

给定的目录路径, 可以说 /root/demo/home/test/sample/somefile.txt OR /etc/demo/home/test/sample/somefile.txt,

我想从给定的目录路径中提取/home/test/sample/somefile.txt。请协助。

由于

回答

2

Use \K丢弃先前匹配的字符。

\/(?:root|etc)\/demo\K\S+ 

DEMO

+0

或'\ /(?:根|等)\ /演示\ K * \ \ W +(= \ S | $)' – 2014-11-02 14:43:22

+0

谢谢,但我想要一个通用的正则表达式,这个正则表达式检查/ root/demo /或/ etc/demo /。我的默认目录可以是一个n级目录,如:/ etc/demo/a/b /或/ root/demo/a/b /。 Bascially传达的默认目录可配置为一个n级深度目录。 – Bablu 2014-11-02 14:54:25

+0

你可以发布一些更多的例子以及预期的输出吗? – 2014-11-02 14:58:41

1

建立您的前缀迪尔斯列表插入一个正则表达式alteration。请务必按length降序排序,也可以使用quotemeta

下面演示:

use strict; 
use warnings; 

my @dirs = qw(
    /root/demo 
    /etc/demo 
); 

# Sorted by length descending in case there are subdirs. 
my $list_dirs = join '|', map {quotemeta} sort { length($b) <=> length($a) } @dirs; 

while (<DATA>) { 
    chomp; 
    if (my ($subdir) = m{^(?:$list_dirs)(/.*)}) { 
     print "$subdir\n"; 
    } 
} 

__DATA__ 
/root/demo/home/test/sample/someroot.txt 
/etc/demo/home/test/sample/someetc.txt 

输出:

/home/test/sample/someroot.txt 
/home/test/sample/someetc.txt 
1

下面是使用quotemeta另一种方式。

Perl的样品:

use strict; 
use warnings; 

my @defaults = ('/root/demo/', '/etc/demo/'); 

$/ = undef; 
my $testdata = <DATA>; 

my $regex = '(?:' . join('|', map(quotemeta($_), @defaults)) . ')(\S*)'; 
print $regex, "\n\n"; 

while ($testdata =~ /$regex/g) 
{ 
    print "Found /$1\n"; 
} 

__DATA__ 

/root/demo/home/test/sample/somefile.txt 
/etc/demo/home/test/sample/somefile.txt 

输出:??

(?:\/root\/demo\/|\/etc\/demo\/)(\S*) 

Found /home/test/sample/somefile.txt 
Found /home/test/sample/somefile.txt