Perl Regex:在将字符串拆分为与模式匹配的组的方法上需要帮助

时间:2011-06-02 02:19:49

标签: regex perl

我需要将此字符串拆分为数组:

$string = "9583526578','9583636523','9673522574','9183556528','9983023378";

以下是分割后我希望我的数组看起来的样子:

@foo = [
           [9583526578, 9583636523],
           [9673522574, 9183556528],
           [9983023378]
       ]

您可能已经注意到,我需要将此字符串拆分为 n 组(在此示例中为2),但如果与 n

如何在Perl中完成?

我已完成了我的研究和实验,但似乎无法在几个小时后完成任务。

感谢您的时间! :)

5 个答案:

答案 0 :(得分:4)

如果你可以相信它们都是整数,那么提取很容易。抓住所有整数。

my @numbers = $string =~ /(\d+)/g;

然后将它们分成两部分......

push @matrix, [splice @numbers, 0, 2] while @numbers;

不像现有的那样具有内存效率,而是简单的代码(如果你搞定列表处理)。

如果将它们分成对的唯一原因是成对处理它们,你可以破坏性地遍历数组......

while( my @pair = splice @numbers, 0, 2 ) {
    ...
}

或者你可以在Perl中以3个部分for循环的罕见有效用途之一成对迭代。

for(
    my $idx = 0;
    my @pair = @numbers[$idx, $idx+1];
    $idx += 2;
)
{
    ...
}

最后,你可以使用perl5i

use perl5i::2;
@numbers->foreach( func($first, $second) { ... } );

您还可以使用List::MoreUtils natatime

答案 1 :(得分:0)

首先拆分“','”以给你一个数组,然后根据需要对元素进行分组。

答案 2 :(得分:0)

我建议使用正则表达式使用'([0-9] +)'检索数字,然后手动构建@foo。或者正如@MRAB建议的那样,拆分更加直截了当。你为什么瞄准正则表达式?

答案 3 :(得分:0)

大量不同的方式。这是一个:

$foo[0] = [];  # assuming you really meant an array of arrays of arrays as you showed
while ($string =~ m/([0-9]++)[^0-9]*+([0-9]++)?/g) {
    push @{ $foo[0] }, [ $1, $2 // () ];
}

(你真的是指一个数组只包含一个对arrayrefs数组的引用吗?)

答案 4 :(得分:0)

这应该与您期望的行为非常接近:

my @foo;
push @foo, [ $1, $2 // () ] while $string =~ / (\d+) (?: \D+ (\d+) ) ? /gx;