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
。