首页 > 解决方案 > 简化正则表达式以捕获重复的子组

问题描述

是否可以简化此正则表达式并仍捕获所有组?

my $str = "1 2 3 4 ;";
$str =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/;
print Dumper( [$1, $2, $3, $4] );

输出

$VAR1 = [
          '1',
          '2',
          '3',
          '4'
        ];

我尝试使用量词来简化:

$str =~ /(?:(\d+)\s+){4}/;

但它给出了:

$VAR1 = [
          '4',
          undef,
          undef,
          undef
        ];

标签: regexperl

解决方案


是的,用于/g匹配所有数字。

my @matches = $str =~ /\d+/g

或者,拆分空格并过滤数字。

grep /\d+/, split /\s+/, $str;

$str =~ /(?:(\d+)\s+){4}/;不起作用,因为虽然{4}导致它匹配 的所有四个实例\d+\s+,但它不会改变只有一个捕获组。


推荐阅读