2011-06-02 18 views
0

我需要這個字符串分割到一個數組中需要幫助:Perl的正則表達式:一個方式來分割字符串成組匹配的模式

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

以下是我希望我的陣列看起來像分割後:

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

正如你可能已經注意到,我需要(在本例中2)這個字符串分割成的ň組,但仍認爲其餘,如果它不與ñ匹配。

這怎麼能在Perl中完成?

我已經完成了我的研究和實驗,但幾個小時後似乎無法完成。

謝謝你的時間! :)

+2

您是否想要在第一個數字之前和最後一個之前添加單引號? – tofutim 2011-06-02 02:28:58

+1

不是。字符串看起來像這樣。 :) – cr8ivecodesmith 2011-06-02 02:59:15

+0

感謝大家的想法。它幫助我探索解決這個問題的其他可能性。 :) – cr8ivecodesmith 2011-06-02 09:07:01

回答

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

+0

哇從來不知道這些方法。無論如何,我會嘗試一下,看看哪些我發現更適用於我的問題。將此標記爲我接受的答案似乎是符合邏輯的。謝謝! :) – cr8ivecodesmith 2011-06-02 09:06:21

0

首先拆分「','」給你一個數組,然後根據需要對元素進行分組。

0

我會推薦使用正則表達式來檢索使用'([0-9] +)'的數字,並且只是手動建立@foo。或者如@MRAB建議的那樣,分割更加直截了當。任何你想瞄準正則表達式的理由?

+0

我已經嘗試了@ MRAB的方法一會兒回來。不過,我只是認爲通過正則表達式做這個會更有效率,因爲我會避免循環數組,然後手動分組(通常我會有一個像超過一千個數字組的字符串)。這個想法當然是基於我有限的知識。我很樂意提供建議。 – cr8ivecodesmith 2011-06-02 03:04:03

+0

當然,我仍然需要在我期望的輸出中循環數組,但由於它已經被預分組,所以它會少一些迭代。 – cr8ivecodesmith 2011-06-02 03:05:41

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數組的數組?)

0

這應該是一個合理的緊密配合您的期望的行爲:

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

Downvoted without comment。尼斯。 – Sean 2011-06-02 15:49:36

相關問題