首先,作为我名字中带有标点符号的人 :-) 请不要使用 \w 来尝试匹配姓名 :-) ... - 和 ' 并不少见。
以 Perl 为例:
if ("Bruce-Robert Fenn Pocock" =~ /^(\w+)(.*)$/) { print "First: $1 Rest: $2" }
→ First: Bruce Rest: -Robert Fenn Pocock
也许只是将所有非空格字符分组,然后跳过第一次出现的空格:
if ("Bruce-Robert Fenn Pocock" =~ /^(\S+)\s*(.*)$/) { print "First: $1 Rest: $2" }
→ First: Bruce-Robert Rest: Fenn Pocock
当然,如果您在数据集中遇到具有中间名名的人,则无法将他们与母母-父母对或多部分姓氏区分开来。
我希望/假设您的输入也没有敬语。
First: Don Rest: Juan de la Mancha
*** wrong: Don is honorific
First: Diego Rest: de la Vega
First: John Rest: Jacob Smith
*** wrong: Jacob is probably a middle name
First: De'shawna Rest: Cummings
First: Wehrner Rest: von Braun
First: Oscar Rest: Vazquez-Oliverez
最终,将一个名字准确地分解为敬称、名、中间名、姓(母名、父名)和后缀的唯一方法是询问 .
(例如,我自己的名字,在盎格鲁圈子里,“芬恩”被认为是“中间名”,在拉丁裔圈子里,它被解释为母语。)
通常可以从列表中猜出敬语和足够用语,但例如军事头衔和博士足够是一个长列表(“Dr John Doe, Pharm.D”、“Maj. Gen. Thomas Ts'o”)并且不是明确的(例如“Don”都是一个简短的“Donald”的形式和敬语)。
PS。可爱的文章在这里:
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/