如何仅捕获Perl正则表达式中的首次出现

时间:2013-02-03 21:12:25

标签: regex perl regex-greedy

我第一次使用Perl(使用TextWrangler),需要有关正则表达式的帮助!

我有一大串物种名称,DNA和其他文字。我想提取以下内容:

Homo sapiens
Pongo abelii
Macaca mulatta

现在,我已定义$ string并拥有此命令(对不起,如果我没有使用正确的术语,我是一个新手):

while($string =~ m/(Homo sapiens|Pongo abelii|Macaca mulatta)/g)
{
    print "$1\n";
}

这是我得到的输出:

Homo sapiens

Homo sapiens

Pongo abelii

Macaca mulatta

Homo sapiens

Homo sapiens

Homo sapiens

Homo sapiens

Homo sapiens

Homo sapiens

如何获得每个物种名称的 ONE ?这让我疯了!!!

3 个答案:

答案 0 :(得分:3)

除了你告诉我们之外,还有更多内容,或者你可以做到:

print "Homo sapiens\nPongo abelii\nMacaca mulatta\n";

但要回答你的问题:

my %seen;
while($string =~ m/(Homo sapiens|Pongo abelii|Macaca mulatta)/g)
{
    print "$1\n" unless $seen{$1}++;
}

或者,更复杂的是,跟踪您正在寻找的内容,并在您找到它们时停止:

my %not_found = ( 'Homo sapiens' => 1, 'Pongo abelii' => 1, 'Macaca mulatta' => 1 );
while ( %not_found && $string =~ /(@{[ join( '|', map quotemeta, sort { length $b <=> length $a } keys %not_found) ]})/g ) {
    print "$1\n";
    delete $not_found{$1};
}

答案 1 :(得分:1)

从正则表达式的末尾删除g修饰符。这代表&#34;全球&#34;并将匹配所有;没有它,只有第一个匹配。

答案 2 :(得分:0)

基本上,您希望删除重复项,因此请使用标准代码。

my %seen;
while ($string =~ /(Homo sapiens|Pongo abelii|Macaca mulatta)/g) {
    print "$1\n" if !$seen{$1}++;
}