根据默认目录确定目录

时间:2014-11-02 14:25:14

标签: regex perl

我想基于给定的目录路径拆分目录,并与perl中的默认目录进行比较,最好是在regex中。我有两个默认目录,比如/ root / demo /和/ etc / demo /。

给定目录路径, 我们说吧 /root/demo/home/test/sample/somefile.txt或 /etc/demo/home/test/sample/somefile.txt,

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

由于

3 个答案:

答案 0 :(得分:2)

Use \K放弃之前匹配的字符。

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

DEMO

答案 1 :(得分: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

答案 2 :(得分: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