2011-08-28 32 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;