2011-08-28 70 views
5

我使用Perl,需要拆分由逗號分隔的作者姓名字符串以及最後一個「和」。名稱形成爲姓氏和名字,看起來像這樣:需要幫助分裂這個字符串的名稱(名字和姓氏對用逗號和「和」分隔)

$string1 = "Joe Smith, Jason Jones, Jane Doe and Jack Jones"; 
$string2 = "Joe Smith, Jason Jones, Jane Doe, and Jack Jones"; 
$string3 = "Jane Doe and Joe Smith"; 
# Next line doesn't work because there is no comma between last two names 
@data = split(/,/, $string1); 

我只是想的全名分成數組,像什麼分裂(元素)會做,這樣@data數組將包含,例如:

@data[0]: "Joe Smith" 
@data[1]: "Jason Jones" 
@data[2]: "Jane Doe" 
@data[3]: "Jack Jones" 

然而,問題是,有在名單的最後兩個名字之間沒有逗號。任何幫助,將不勝感激。

+0

如何處理「Joe Smith,MD and Mary and Joe Smith」這樣的「姓名」? – tadmc

+0

請注意,您不使用'@data [1]'而是'$ data [1]'。既然你只使用一個元素,它是一個標量。 –

回答

10

你可以在你的正則表達式中使用一個簡單的交替進行拆分:

my @parts = split(/\s*,\s*|\s+and\s+/, $string1); 

例如:

$ perl -we 'my $string1 = "Joe Smith, Jason Jones, Jane Doe and Jack Jones";print join("\n",split(/\s*,\s*|\s+and\s+/, $string1)),"\n"' 
Joe Smith 
Jason Jones 
Jane Doe 
Jack Jones 

$ perl -we 'my $string2 = "Jane Doe and Joe Smith";print join("\n",split(/\s*,\s*|\s+and\s+/, $string2)),"\n"' 
Jane Doe 
Joe Smith 

如果你還必須處理牛津大學ma(即「這個,那個,和其他的東西」),那麼你可以使用

my @parts = split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $string1); 

例如:

$ perl -we 'my $s = "Joe Smith, Jason Jones, Jane Doe, and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"' 
Joe Smith 
Jason Jones 
Jane Doe 
Jack Jones 

$ perl -we 'my $s = "Joe Smith, Jason Jones, Jane Doe and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"' 
Joe Smith 
Jason Jones 
Jane Doe 
Jack Jones 

$ perl -we 'my $s = "Joe Smith and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"' 
Joe Smith 
Jack Jones 

感謝stackoverflowuser2010的注意這種情況。

你會希望\s*,\s*and\s+之初保持交替的其他分支從分裂的逗號或「和」第一,this order appears to be guaranteed as well

替代品都試過了,從左至右,所以找到整個表達式匹配的第一個替代方案,就是選擇的方法。

+3

或者您可以使用|沒有組...... – ysth

+0

@ysth:你可能會猜測我是以'\ s *(...)\ s *'開頭的,並且將它改進以消除不良。 –

+0

在這個解決方案中該組的好處是什麼,而不僅僅是|作爲@yslth建議? – cftarnas

4

split之前,有,替換and

$string1 =~ s{\s+and\s+}{,}g;