使用Perl Regex提取第n次出现

MCH*_*MCH 3 regex perl

我试图找到解析这样一行的最佳方法:


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

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

if ($line =~ /^(.*\|){6}(\w*)\|/ ) {  
    print $2;  
}
Run Code Online (Sandbox Code Playgroud)

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

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

yst*_*sth 8

您可以.*?改为使用*更少次数来修改.

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

或者您可以使用拆分:

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

(8是可选的,告诉分裂在到达第7个之后不再费心去尝试|)