所以我试图在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的新手,这让我很伤心!
答案 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