使用Perl Regex提取第n次出现

时间:2010-12-19 08:08:57

标签: regex perl

我正在尝试找到解析看起来像这样的行的最佳方法:


Explicit|00|11|Hello World|12 3 134||and|blah|blah|blah

我只想提取第6和第7纵杆之间的东西 我试过像

这样的东西
if ($line =~ /^(.*\|){6}(\w*)\|/ ) {  
    print $2;  
}

问题在于,由于.*,第一部分似乎与最长的序列匹配,也许我应该使用不同的东西。在垂直条之间,有字母数字字符,空格和标点符号。

我应该匹配它们之间的最短距离吗?

2 个答案:

答案 0 :(得分:8)

您可以改为使用.*?来修改*,使其更喜欢更少次数。

如果您想要的字段包含非单词字符,则仍可能在错误的位置匹配;为了防止这种情况你可以明确地说出任何东西 - 但是 - (([^|]*\|){6})或禁用该部分的回溯(((?>.*?\|)){6})。

或者你可以使用split:

if ( my $seventh = ( split /\|/, $line, 8 )[6] ) {
    print $seventh;
}

(8是可选的,并且告诉分裂在到达第7个之后不再打扰尝试|)

答案 1 :(得分:3)

使用拆分。像my @fields = split /\|/, $str这样的东西应该有效。然后,您只需索引您感兴趣的字段(也将保留空字段)。 |必须转义,因为它是regexp运算符。