我想根據給定的目錄路徑分割出一個目錄,並與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。請協助。
由於
我想根據給定的目錄路徑分割出一個目錄,並與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。請協助。
由於
建立您的前綴迪爾斯列表插入一個正則表達式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
下面是使用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
或'\ /(?:根|等)\ /演示\ K * \ \ W +(= \ S | $)' – 2014-11-02 14:43:22
謝謝,但我想要一個通用的正則表達式,這個正則表達式檢查/ root/demo /或/ etc/demo /。我的默認目錄可以是一個n級目錄,如:/ etc/demo/a/b /或/ root/demo/a/b /。 Bascially傳達的默認目錄可配置爲一個n級深度目錄。 – Bablu 2014-11-02 14:54:25
你可以發佈一些更多的例子以及預期的輸出嗎? – 2014-11-02 14:58:41