如何通过分组仅捕获Perl正则表达式的一部分?

时间:2010-04-19 12:40:13

标签: regex perl capture

我当前正试图从文件中提取日期并将它们直接送入数组。我的正则表达式正在工作,但我有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

2 个答案:

答案 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 ));

将所有其他组置于被动状态,现在只将第一组添加到数组中。