完全匹配Perl中类似字符串列表中的字符串

时间:2015-09-23 04:27:47

标签: regex perl

我有一个包含以下行的文件

1.39.2.1    Build 001

1.39.1.2    Build 002

1.39.1.1    Rejected Build

1.39        Succesful Build 004

我试图打印这条线" 1.39 Succesful Build 004" 下面是我的perl脚本

my $file = 'C:\labels.txt';

open(FILE,$file) or die ("Cannot the open the file : $file");

my $ver = "1.39";

my @arr;

foreach (FILE)
{

    if($_  =~ m/1.39/)
    {
        print $line;

    }

}

close(FILE);

当我运行此脚本时,它会打印所有行(包括1.39.x.x)。但我想要的线条恰好是1.39。如何搜索它。

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

如果您希望与其他行不匹配,请在1.39之后使用空格,如下所示:

/^1.39\s/

Demo

答案 1 :(得分:0)

我猜你正在尝试匹配构建成功的行。

#!/usr/bin/perl
use strict;
use warnings;
while(<DATA>){
    next if $_ =~ /^\s*$/; #skip empty lines
    my ($build, @status) = split /\s+/;
    print $_ if join(",", @status) =~ /Succesful/;
    #you may modify the above regex based on your requirement
    #I tried to match line which says build is successful
    #See dawg's answer, he matched exact build 1.39
}
__DATA__
1.39.2.1    Build 001

1.39.1.2    Build 002

1.39.1.1    Rejected Build

1.39        Succesful Build 004

Demo

答案 2 :(得分:0)

没有人花时间解释为什么你现有的代码不起作用。我认为这是因为你对正则表达式如何运作感到有些困惑。

如果正则表达式模式匹配字符串中的任何位置,则文本字符串将匹配正则表达式。

您的正则表达式为/1.39/。实际上,那里存在一个小问题,因为点在正则表达式中具有特殊含义(它匹配任何字符),因此要匹配您需要转义的实际点,并且正则表达式变为/1\.39/

好的,现在你的正则表达式问问题&#34;这个字符串是否包含子字符串&#34; 1.39&#34;。当然,所有数据行都包含该子字符串。例如,行1.39.2.1 Build 001包含&#34; 1.39&#34; - 它在一开始就在那里。当然,它之后是其他东西,但正则表达式匹配并不关心它。正则表达式匹配只是询问&#34;这个字符串是否包含这个子字符串?&#34;

所以你需要在你的正则表达式中更精确。你需要匹配&#34; 1.39&#34;就它本身而言,在它之前没有任何东西,只有它之后的空白。这是其他答案的来源。您可以将^放在正则表达式的开头,以匹配行的开头,并将\s放在最后,以匹配空格。所以你的正则表达式变成/^1\.39\s/