2010-12-19 30 views
2

我试图找到解析一条线,像这样的最佳方式:提取第n次出现Perl的正则表达式


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

我只是要提取的第6和第7竖线之间的东西|
我想是这样

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

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

我应该匹配他们之间最短的?

+0

为什么不只是分割“|”? – Shurdoof 2010-12-19 08:13:27

+0

你说得对。我想我刚刚玩了一段时间的正则表达式,所以我甚至没有想过使用其他函数:) – MCH 2010-12-19 08:23:14

回答

8

您可以改用.*?来修改*以使其偏好次数更少。

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

或者你可以只使用分裂:

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

(8是可选的,告诉分裂不要打扰达到月7日以后再试图|)

+0

哦,那太好了。是的,我只会使用分割,更有意义。 – MCH 2010-12-19 08:24:20

3

使用分裂。像my @fields = split /\|/, $str应该工作。然后,您只需索引您感兴趣的字段(也会保留空白字段)。 |必须逃脱,因为它是正则表达式运算符。

相关问题