0

假设我想匹配并捕获由一个或多个空格分隔的 5 个整数 - 示例输入:

1111 234 3333 456 7890

我可以这样做:

my $input = '1111        234            3333          456    7890';
if($input =~ /^\s*([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)/)
{
  #$1 = '1111', $2 = '234', $3 = '3333', $4= '456', $5 = '7890'
}

但我想做这样的事情来保持正则表达式更简单,而不是明确地重复每个 int 5次:

my $input = '1111        234            3333          456    7890';
if($input =~ /^((\s*[0-9]+){5})/)
{
  #$1 = '1111        234            3333          456    7890';
  #$2 = ' 7890'
  #all other capture variables are undefined
}

但是,捕获似乎没有成功。

有没有办法我可以做到这一点并且仍然可以访问我的 5 个捕获?

更好的是未知数量的捕获:

my $input = '1111        234            3333          456    7890';
if($input =~ /^((\s*[0-9]+)+)/)
{
   #foreach capture 1..N do something...
}
4

4 回答 4

4
my @numbers = $input =~ /\d+/g;

全局标志将返回列表上下文中的所有匹配项,这些匹配项将存储在您的数组中。

于 2012-04-18T22:48:36.313 回答
0

如果您知道分隔符是什么(在本例中为一个或多个空格),那么您不需要正则表达式来捕获您想要的内容。您可以使用split.

use strict;
use warnings;

my $input = "1111        234            3333          456    7890";
my @ints=split /\s+/,$input;
print "$_\n" foreach(@ints);

产生输出:

1111
234
3333
456
7890
于 2012-04-18T22:39:54.307 回答
0

行的模式是否总是由空格分隔的数字组?如果是这样,而不是正则表达式,为什么不根据空格拆分为数组

@outArray = split (/ +/,$input);
于 2012-04-18T22:40:34.933 回答
-1

以下将捕获前 5 个整数,如果这就是您所追求的,则忽略之后的任何整数。我可能并不完全清楚。

#!/usr/bin/perl
use strict;
use warnings;

my $in = '1111        234            3333          456    7890 12 13';

my @ints = (split ' ', $in)[0 .. 4];

print "@ints\n";

印刷:

1111 234 3333 456 7890

克里斯

于 2012-04-18T22:57:26.730 回答