将名称分为第一,中,最后

时间:2013-12-11 21:48:01

标签: regex perl split

希望从名称如下的名称中分割成名字,中间名和姓氏:

# this is the format
$full_name = 'lastname, firstname (middleinitial)'
# this is what it would look like
$full_name = 'Doe, John (D)'

名称始终遵循此格式。这些将存储在变量firstmiddlelast中。 middle不应包含任何括号。是的,拆分功能可以在这里使用;但是,full_name不保证包含字符串。它可能是:

$full_name = ''

我不确定拆分是否适合这样的事情。像我所描述的那样分割名字的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

my $full_name = 'Doe, John (D)';
my ($last, $first, $middle) = split /[,() ]+/, $full_name;

答案 1 :(得分:2)

use strict;
use warnings;

my $full_name = 'Doe, John (D)';
my ($last, $first, $middle) = $full_name =~ /([\w'-]+)/g;

print "First: $first\nMiddle: $middle\nLast: $last";

输出:

First: John
Middle: D
Last: Doe

答案 2 :(得分:0)

您可以将这些与速记字符类匹配:\w+

当然,这不是你所要求的?

如果你想让它变得更复杂:

(^\w+)|((?<=\s)\w+(?=\s))|(\w+(?=\)))

哪个会捕获:

  • 名字group 1
  • 姓氏group 2
  • 初始group 3

答案 3 :(得分:0)

这个问题并不像看起来那么简单,答案取决于实际的数据。

考虑到模糊的规范,我不会写这个

use strict;
use warnings;

my $name_possibles = qr/[^ \s , ( ) [:cntrl:] ]/x;
my $name_re        = qr/(?: $name_possibles+ (?: \s+ $name_possibles+ )* )/x;

my $full_name = 'Doe, John (D)';

my @parts = $full_name =~ /($name_re), \s* ($name_re) \s* \( \s* ($name_re) \s* \)/xg;

use Data::Dump;
dd \@parts;

<强>输出

["Doe", "John", "D"]