在第一场比赛中停止正则表达式,它显示两次

时间:2015-06-10 06:31:29

标签: regex perl match

我正在编写一个perl脚本,我有一个简单的正则表达式来捕获数据文件中的一行。该行以IG-XL Version:开头,后跟数据,因此我的正则表达式匹配该行。

if($row =~/IG-XL Version:\s(.*)\;/)
{
    print $1, "\n";
}

让我们说$1打印9.0.0。这是我想要的结果。但是,在相同数据文件的另一部分中,还有相同IG-XL Version:。 $ 1现在打印出两个数据9.0.0

我只希望它匹配第一个,所以我只能获得一个值。我尝试了/IG-XL Version:\s(.*?)\;/这是建议最多的解决方案,添加了?,因此它会.*?,但它仍会输出两个。有什么帮助吗?

编辑:

$row的值为:

Current IG-XL Version: 8.00.01_uflx (P7); Build: 11.10.12.01.31
Current IG-XL Version: 8.00.01_uflx (P7); Build: 11.10.12.01.31

我想要的值是8.00.01_uflx (P7)我得到的,但是两次。

1 个答案:

答案 0 :(得分:1)

在逐行读取文件时执行此操作的唯一方法是保留一个状态标志,记录您是否已找到该模式。但是,如果您将数据存储在散列中,就像在your previous question中一样,那么它就会重要,因为您只需用相同的值覆盖散列元素

if ( $row =~ /IG-XL Version:\s*([^;]+)/ and not $seen_igxl_vn ) {
    print $1, "\n";
    $seen_igxl_vn = 1;
}

或者,如果文件相当小,您可以将整个内容读入内存并仅搜索每个项目的第一次出现

我建议您发布一个显示完整程序,输入数据和所需输出的问题,这样我们就可以为您提供完整的解决方案,而不是一点一点地看到您的问题