我当前正试图从文件中提取日期并将它们直接送入数组。我的正则表达式正在工作,但我有6个组,当我只想要第一个时,所有这些组都被添加到数组中。
@dates = (@dates, ($line =~ /((0[1-9]|[12][0-9]|3[01])(\/|\-)(0[1-9]|1[0-2])(\/|\-)([0-9][0-9][0-9][0-9]|[0-9][0-9]))/g ));
有一种简单的方法来获取perl正则表达式的$ 1组吗?
我的输出看起来像这样:
13/04/2009, 13, /, 04, /, 2009, 14-12-09, 14, -, 12, -, 09
答案 0 :(得分:4)
当我接下来拿起代码时,那个正则表达式会让我感到困惑。 我会打破它:
my $date= qr/
(?:0[1-9]|[12][0-9]|3[01]) # day
(?:\/|\-)
(?:0[1-9]|1[0-2]) # month
(?:\/|\-)
(?:[0-9][0-9][0-9][0-9]|[0-9][0-9]) #year
/x ;
您可以使用
将元素添加到数组中 push @dates, ($line =~ /($date)/ ) ;
你简化了分隔符位(注意我已更改为使用( )
而不是/ /
以避免必须使用/
my $date= qr (
(?: 0[1-9] | [12][0-9] | 3[01] # day
[/-]
(?:0[1-9]|1[0-2]) # month
[/-]
(?:\d{4}|\d{2}) #year
)x ;
答案 1 :(得分:1)
刚刚找到它。您可以在组的开头使用?:
创建被动组。
@dates = (@dates, ($line =~ /((?:0[1-9]|[12][0-9]|3[01])(?:\/|\-)(?:0[1-9]|1[0-2])(?:\/|\-)(?:[0-9][0-9][0-9][0-9]|[0-9][0-9]))/g ));
将所有其他组置于被动状态,现在只将第一组添加到数组中。