Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从Perl中的相似字符串列表中精确匹配字符串_Regex_Perl - Fatal编程技术网

Regex 从Perl中的相似字符串列表中精确匹配字符串

Regex 从Perl中的相似字符串列表中精确匹配字符串,regex,perl,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成功构建004” 下面是我的perl脚本 my $file = 'C:\labels.txt'; open(FILE,$file) or die ("Cannot the open the file : $file"); my $v

我有一个文件,它有以下几行

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成功构建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。你怎么能找到它


非常感谢您的帮助。

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

/^1.39\s/

我想你们是在试图匹配说构建成功的那个句话

#!/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
#/usr/bin/perl
严格使用;
使用警告;
while(){
下一步如果$$$/^\s*$/;#跳过空行
我的($build,@status)=拆分/\s+/;
如果join(“,”,@status)=~/successful/,则打印$;
#您可以根据自己的要求修改上述正则表达式
#我试着匹配说构建成功的线路
#看dawg的回答,他完全符合1.39的构造
}
__资料__
1.39.2.1构建001
1.39.1.2构建002
1.39.1.1被拒绝的构建
1.39成功构建004

还没有人花时间解释为什么现有代码不起作用。我认为这是因为您对正则表达式的工作原理有点困惑

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

正则表达式是
/1.39/
。实际上,这里有一个小问题,因为点在正则表达式中有一个特殊的含义(它匹配任何字符),所以要匹配实际的点,您需要对它进行转义,您的正则表达式变成
/1\.39/

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


所以你需要在正则表达式中更加精确。您需要单独匹配“1.39”,行中前面没有任何内容,后面只有空格。这就是其他答案的来源。您可以将
^
放在正则表达式的开头以匹配行的开头,将
\s
放在末尾以匹配空格。因此,您的正则表达式变为
/^1\.39\s/

我尝试使用($\u=~ m/^1.39$/),在这种情况下,不会打印任何行。因为
^1.39$
将尝试查找开头为1,结尾为9的行。你没有这样的行。如果你想从
1.39.2.1
中获取
1.39
,你需要在正则表达式中捕获它们<代码>如果($=~m/(1.39)/)结果将是
$1
.ThanQ,这都是为了你的时间和精力。也需要
^
避免匹配
11.39
1.39.1.39