2011-07-12 114 views
1

使用Perl,我想split上逗號的字符串和該「和」(其可以或可以不通過逗號之前。Perl的分裂逗號與分隔的列表「和」

  1. "Apple"給出陣列(Apple)
  2. "Apple and Orange"給出陣列(Apple Orange)
  3. "Apple, Orange, and Banana"給出陣列(Apple Orange Banana)

出於某種原因,下面分正則表達式是不是爲我工作:

split(/(,| and)/, $string) 

回答

3

試試這個:

my @list = split /\s*(?:(?:,\s*)?\band\b|,)\s*/, $string; 

例子:

perl -E "say join ':', split /\s*(?:(?:,\s*)?\band\b|,)\s*/, 'apple, orange, and banana'" 
apple:orange:banana 

或者一個簡單的工作情況下,你例如:

/,? and |,/
+0

謝謝,可以完美運行。你能讓我知道'(?:)'匹配什麼嗎? –

+0

這是一個非捕獲組。做一個正常的組(')',但不捕獲內容。 – Qtax

1
my $str = 'Apple, Orange, and Banana'; 

$str =~ s/,?\s*and\b/,/; 
my @words = split /\s*,\s*/, $str; 
1

以下split應該爲你工作:

split /(?: ,?\s*and\s* | ,\s+?)/x; 
1

這裏有一個解決方案。它依靠兩個split進行所有繁重工作,爲了方便起見使用了map。它可能與其他答案沒有太大區別,但它很乾淨,而且在眼睛上相當容易(除了打印)。我認爲它可以適用於空白/和/逗號的大部分變體。

use warnings; 
use strict; 

my @w = ("Apple", "Apple and Orange", "Apple, Orange, and Banana", 
    "Apple, Orange and Banana ,and Pineapple"); 

for (@w) { 
    print join (':', humanize($_)), "\n"; 
} 


sub humanize { 
    my $str = shift; 
    my @list = split /\s*and\s*/, $str; 
    @list = map { split /\s*,\s*/, $_ } @list; 
    return @list; 
} 

輸出:

Apple 
Apple:Orange 
Apple:Orange:Banana 
Apple:Orange:Banana:Pineapple