来自perl的正则表达式的奇怪输出

时间:2016-03-24 21:31:50

标签: regex perl

所以我试图在perl中获取正则表达式的所有匹配但是输出与奇怪的值混合在一起? 这是我的perl代码:

#!/usr/bin/env perl

use strict;
use warnings;
my $filename="test.txt";

my $data;
open($data,$filename) or die "couldn't open the file";
while(<$data>)
{
chomp($_);


my @count = ($_ =~ /(((\d){1,4}(\s|\-|\.|\/)){1,3}(\d){2,4})/g);

print @count;

print "\n";
}

我的文本文件内容如下:

content 10-12-2015
content 10 12 2015
content 10-12-2015
content 10/12/2015
content 10.12.2015
content 10.12.15
content 10.12.1412
content 1992.12.30
content 22/04/96
content 1996-04-22
content 22.04.96
content 10.12.1412
content 1992.12.30
content 22/04/96
content 04/22/96

真正奇怪的输出是匹配的正则表达式和其他值?在阵列中。

10-12-201512-2-5
10 12 201512 2 5
10-12-201512-2-5
10/12/201512/2/5
10.12.201512.2.5
10.12.1512.2.5
10.12.141212.2.2
1992.12.3012.2.0
22/04/9604/4/6
1996-04-2204-4-2
22.04.9604.4.6
10.12.141212.2.2
1992.12.3012.2.0
22/04/9604/4/6
04/22/9622/2/6

正常输出的一个例子是:10-12-2015但是这个值来自12-2-5? 问题是,在我的其他文本文件中,我在一行中有多个日期,这意味着我只能从数组中获得第一个匹配。

请帮助。 。 。 。 !我是Perl的新手,这让我很伤心!

3 个答案:

答案 0 :(得分:2)

  

这个值来自12-2-5?

由于您使用的是嵌套捕获组,它正在捕获各个部分。

来自10-12-2015,它正在捕捉12- 2 - 5,这会在{{完全捕获 {{}后的结果中反映出来1}}。每个实例也是如此。

要仅提取日期,您可以使用此正则表达式。

正则表达式: 10-12-2015

此正则表达式不使用捕获组

<强> Regex101 Demo

答案 1 :(得分:1)

可能为时已晚,但使用noobs正则表达式捕获组,您的代码可能看起来像这样

#!/usr/bin/env perl

use strict;
use warnings;
my $filename="file.txt";

my $data;
open($data,$filename) or die "couldn't open the file";
while (my $line = <$data>){
    chomp($line);
    my (@count) = $line =~ /((?:\d{2}|\d{4})[-\/\.\s]\d{2}[-\/\.\s](?:\d{4}|\d{2}))/g;

    print join(" : ", @count);

    print "\n";
}

输出

10-12-2015
10 12 2015 : 10.12.2015 : 11-23-2014
10-12-2015
10/12/2015
10.12.2015
10.12.15
10.12.1412 : 10.12.1412
1992.12.30
22/04/96
1996-04-22
22.04.96
10.12.1412
1992.12.30 : 10.12.2015
22/04/96
04/22/96

答案 2 :(得分:0)

当您对这些值不感兴趣时​​,不应该使用正则表达式进行这么多分组。

每个开头(都会在结果列表中提供一个值。

您可以使用以下稍微重新设置来最小化分组,并且每次匹配只需要处理2个值:

$_ =~ /((\d{1,4}[\s.\\-]){1,3}\d{2,4})/g