【问题标题】:Perl Regex: Need help on a way to split string into groups matching a patternPerl 正则表达式:需要帮助将字符串拆分为匹配模式的组
【发布时间】:2011-06-02 14:36:12
【问题描述】:

我需要把这个字符串拆分成一个数组:

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

这是我希望我的数组在拆分后的样子:

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

您可能已经注意到,我需要将此字符串拆分为 n 组(本例中为 2 个),但如果它与 n不匹配,仍需考虑余数>.

如何在 Perl 中做到这一点?

我已经完成了我的研究和实验,但几个小时后似乎无法正确完成。

感谢您的宝贵时间! :)

【问题讨论】:

  • 您的意思是在第一个数字之前和最后一个数字之后添加单引号吗?
  • 没有。字符串真的看起来像那样。 :)
  • 感谢大家的意见。它帮助我探索解决这个问题的其他可能性。 :)

标签: regex perl


【解决方案1】:

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

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::MoreUtilsnatatime

【讨论】:

  • 哇从来不知道这些方法。无论如何,我会尝试它们,看看我发现哪些更适用于我的问题。将其标记为我接受的答案似乎是合乎逻辑的。谢谢! :)
【解决方案2】:

首先在 "','" 上拆分为您提供一个数组,然后根据需要对元素进行分组。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不久前我已经尝试过@MRAB 的方法。但是,我只是认为通过正则表达式执行此操作会更有效,因为我会避免循环遍历数组然后手动对它们进行分组(通常我会有一个包含一千多个数字组的字符串)。当然,这种想法是基于我有限的知识。我愿意接受建议。
    • 当然,我仍然需要在我想要的输出中循环遍历数组,但它的迭代次数会更少,因为它已经预先分组了。
    【解决方案4】:

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

    $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 数组的引用的数组吗?)

    【讨论】:

      【解决方案5】:

      这应该与您期望的行为相当接近:

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

      【讨论】:

        猜你喜欢
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 2018-05-13
        相关资源
        最近更新 更多