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

Regex 如何通过分组只捕获Perl正则表达式的一部分?,regex,perl,capture,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, /

我现在尝试从文件中提取日期,并将其直接输入数组。我的正则表达式正在工作,但我有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

刚找到。您可以使用组开头的?:创建被动组

@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 ));

通过使所有其他组都处于被动状态,现在只有第一个组被添加到数组中。

刚刚找到它。您可以使用组开头的?:创建被动组

@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 ));

通过使所有其他组都处于被动状态,现在只有第一个组被添加到数组中。

当我下一次拿起代码时,正则表达式看起来会让我感到困惑。 我会说:

    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
       (?:\/|\-)
       (?:[0-9][0-9][0-9][0-9]|[0-9][0-9])  #year
       /x ;
可以使用将元素添加到数组中

    push @dates,   ($line =~ /($date)/ ) ;
您可以简化分隔符位,注意我已改为使用,而不是//以避免在/


如果你只想要第一个,为什么要把它们都拿来?使用paren会导致返回它们。但是,如果您必须全部提取,只需取消定义您不需要的值。请添加一个您试图解析的源字符串的示例。当您删除正则表达式末尾的g时会发生什么情况?@heferav我试图提取xx/xx/xx、xx/xx/xxxx、xx-xx-xx或xx-xx-xx如果您只想要第一个,为什么要全部提取它们?使用paren会导致返回它们。但是如果你必须把它们都取出来,只需取消定义你不想要的值。请添加一个你试图解析的源字符串的例子。当你去掉正则表达式末尾的g时会发生什么情况?@heferav我试图拉出xx/xx、xx/xx/xxxx、xx-xx或xx-xx-xx-xx-xx。此外,你使用的括号比你需要的要多。例如,,:\/\-可以是[\/-]。另外,不要忘记[0-9][0-9][0-9][0-9]可以是\d{4}。此外,您使用的括号比您需要的要多。例如,,:\/\-可以是[\/-]。另外,不要忘记[0-9][0-9][0-9][0-9]可以是\d{4}。谢谢您的时间。是的,肯定更清晰。我还在想Regex呢,谢谢你。是的,肯定更清晰。我还在想Regex。