从长文件路径(regex)perl中提取id

时间:2016-09-19 20:35:29

标签: regex perl extract

我试图从我在perl脚本中读取的文件路径中提取id(例如11894373690) -

/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ 

我将进一步使用它创建一个像

这样的新路径
/my/local/projects/Samplename/analysis/test/output/tool2/11894373690_NEW/

我无法从路径中提取id,有人可以在perl中建议一个简单的方法。我一定要开始学习正则表达式! 谢谢。 我只能获得最后一个目录名

$file = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";

my ($id) = $file =~ /\.(A1[^]+)/i;

更新 - 抱歉所有我拼写错误"不是" as" now"早!我无法提取id。谢谢!

3 个答案:

答案 0 :(得分:1)

你需要修理什么?什么是动态的?对于这个网址,假设posfix将远离_cast,你可以使用表达式:

(\d+)_cast

所以ID将出现在第一个选择组

答案 1 :(得分:1)

一个简单的正则表达式或拆分很好,但有多个核心包用于处理路径。

这使用File::Spec分割路径并稍后加入新路径。请注意,没有转义或类似情况,没有/计数 - 实际上甚至不需要提及分隔符。

use warnings 'all';
use strict;

use File::Spec::Functions qw(splitdir catdir);

my $path_orig = '...';

my @path = splitdir $path_orig;

my ($mark, $dir);
foreach my $i (0..$#path) 
{ 
    if ($path[$i] =~ m/(\d+)_cast/) 
    {
        $dir = $1;
        $mark = $i;
        last;
    }
}

my $path_new = catdir @path[0..$mark-1], $dir . '_NEW';

您可以通过其他方式操纵@path数组 - 当然 - 从其背面剥离组件(pop @path while $path[-1] !~ /.../),或者迭代并复制到新数组等。

上面的代码很简单,不需要额外的数据复制,也不需要多个正则表达式匹配。

显然旧路径和新路径有另一个区别(tool1 vs tool2),请调整。重点是,一旦路径被拆分,通过数组很简单。

至于一个简单的正则表达式来获取id

my ($id) = $path =~ m|/(\d+)_cast/|;  # Windows

如果\d+_cast 某些不明确(只有一个dir在其名称中出现),请将/放在上面。

答案 2 :(得分:0)

我确实找到了获取ID的方法 - 它可能效率不高但现在可以使用 我做了

my $dir_path = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";
my @keys =(split(/[\/_]+/,$dir_path));
print "Key is $keys3[9]\n";

它打印出11894373690 谢谢大家的建议!