如何将全名字符串分割成名字和姓氏字符串?

40

我需要帮助处理这个问题,我有一个包含完整名字的字符串,需要将其分离并将其作为名和姓分别使用。


12
用哪种语言?英语?您想如何处理中间名?您想如何处理“先生”、“小”或“胡安·加西亚·洛佩兹博士小”这样的称呼? - John Saunders
你有分隔符吗? "Edimar*Lima",* = 分隔符 - Tocco
1
如果您不展示实际字符串的样子,我们很难提供帮助。 - Gabe
正如John所指出的,名称可能会很棘手。根据您的用例,最好要么避免拆分名称,要么设计您的UI以便用户自行拆分。 - hammar
21个回答

59

如果你确定有名字和姓氏,这个方法会起作用。

string fullName = "Adrian Rules";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];

请确保检查names的长度。

names.Length == 0 //will not happen, even for empty string
names.Length == 1 //only first name provided (or blank)
names.Length == 2 //first and last names provided
names.Length > 2 //first item is the first name. last item is the last name. Everything else are middle names

更新

当然,这只是对这个问题的一个相当简化的视图。我的回答的目的是解释string.Split()的工作原理。但你必须记住,一些姓氏是复合的,比如"Luis da Silva",正如@AlbertEin所指出的那样。

这远非一个简单的问题可以解决。一些介词(在法语、西班牙语、葡萄牙语等中)是姓氏的一部分。这就是为什么@John Saunders问“是哪种语言?”。John还指出前缀(先生,夫人)和后缀(Jr.,III,M.D.)可能会妨碍处理。


1
我希望那样,不过并不是这样... :( 但我很高兴它不是“糟糕”的 :) - Adriano Carneiro
1
代码中出现了一个错误,我已经修复了。请给个赞,谢谢。 - Adriano Carneiro
1
"names.Length > 2 //在索引0处是名字,而在索引Length-1处是姓氏。": 这不是真的!可能没有中间名,但姓氏由多个单词组成。 - albertein
1
@Adrian 例如“Pedro de la Garza”,名字:“Pedro”,姓氏:“De la Garza”。N - albertein
1
如果名字是“Juan Carlos”,两个单词都是名字的一部分,该怎么办? - user773456
显示剩余5条评论

18
你可以尝试使用空格解析它,但这不会起作用,例如:
var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);

但是如果用户输入的是两个名字呢,比如 "Juan Pablo Perez",那么这种方法就会失败。

姓名是很复杂的东西,因此在给定一个字符串时,无法总是确定哪部分是名字的首部和尾部。

编辑

你不应该使用string.Split方法来提取姓氏,因为有些姓氏由两个或更多单词组成,例如,我的一个朋友的姓氏是"Ponce de Leon"。


可能应该修改你的代码以使用split方法,不过你提到了另一个我同意的东西。 - m4tt1mus
split的问题在于,如果您的姓中包含空格,则会丢失部分名称。例如,我的一个朋友姓“Ponce de leon”。 - albertein
这远非简单问题。想要一些样例吗?托马斯·爱迪生:姓不是阿尔瓦·爱迪生。庞塞·德·莱昂:姓是德·莱昂。你怎么知道?因为有介词“de”。还有“da”等。 - Adriano Carneiro
@Adrian,你错了,“Ponce de Leon”是姓氏,而不是“de Leon”。实际上,以任何可靠的方式都无法完成OP所要求的操作。 - albertein
这应该是被接受的答案。它可以适用于任意数量的中间名。 - bahramzy
这也需要检查是否只提供了一个名字。例如fullName =“Perez”; - Proggear

16

这个解决方案适用于姓氏由多个单词组成的人。将第一个单词视为名字,其余部分作为姓氏。

public static string getLastNameCommaFirstName(String fullName) {
    List<string> names = fullName.Split(' ').ToList();
    string firstName = names.First();
    names.RemoveAt(0);

    return String.Join(" ", names.ToArray()) + ", " + firstName;            
} 

例如将Brian De Palma传递到上述函数中,将返回"De Palma, Brian"

getLastNameFirst("Brian De Palma");
//returns "De Palma, Brian"

1
这对于任何有中间名或名字包含空格的人都不起作用。 - Rachel613
@Rachel613 可能是对的,但名字中有空格的情况很少见。总体而言,大多数情况可以更好地适应这种方式。 - Ken

10

您可以使用此版本(MSDN)Split方法,如下所示:

var testcase = "John Doe";
var split = testcase.Split(new char[] { ' ' }, 2);

在这个例子中,split[0] 会是 John,而split[1] 则会是 Deo。另一个例子:
var testcase = "John Wesley Doe";
var split = testcase.Split(new char[] { ' ' }, 2);

在这种情况下,split[0]将是John,而split[1]将是Wesley Doe
请注意,split的长度永远不会超过2。
因此,使用以下代码可以很好地获取FirstNameLastName:
var firstName = "";
var lastName = "";
var split = testcase.Split(new char[] { ' ' }, 2);
if (split.Length == 1)
{
    firstName = "";
    lastName = split[0];
}
else
{
    firstName = split[0];
    lastName = split[1];
}

希望我的回答能够对这个页面有所帮助。

8

尝试:

  string fullName = "The mask lol"; 
    string[] names = fullName.Split(' '); 
    string name = names.First();
    string lasName = names.Last(); 

1
为什么不使用 string name = names.First(); - Filburt
2
这是一个邪恶的解决方案.. JOhn Van Meter中,“Van Meter”是姓氏。你的解决方案将完全毁掉这个姓氏。 - user384080
它执行了用户请求的操作。它将名字和姓氏分开,只考虑它们是否被空格分隔。他没有提到要考虑任何其他因素,例如它在不同语言中的分隔方式。 - The Mask
@Filburt:已编辑。抱歉回复稍晚 :) - The Mask

4

我建议使用正则表达式来严格定义你的名字和姓氏的样式。


4

在nuget上有几种名称解析/拆分的实现。如果您深入了解NameParserSharp存储库,还可以将两个部分类组合并复制并粘贴到自己的库中。

NameParserSharp

Nuget上的更多内容


3

变量名为"Tony Stark is dead"。

get_first_name(String name) {
    var names = name.split(' ');
    String first_name= "";
 
    for (int i = 0; i != names.length; i++) {
      if (i != names.length - 1) 
      {
        if (i == 0) {
          first_name= first_name+ names[i];
        } else {
          first_name= first_name+ " " + names[i];
        }
      }
    }
    return first_name; // Tony Stark is
  }



  get_last_name(String name) {
    var names = name.split(' ');
    return names[names.length - 1].toString(); // dead
  }

1

这里有一段我在项目中使用的C#代码。它将最后一个单词作为姓氏,其余部分作为名字返回。

Fiddle

输出结果:

Mary Isobel Catherine O’Brien
-------------------------
Name : Mary Isobel Catherine , Surname : O’Brien

附言:没有中间名,抱歉。

public static string[] SplitFullNameIntoNameAndSurname(string pFullName)
{
    string[] NameSurname = new string[2];
    string[] NameSurnameTemp = pFullName.Split(' ');
    for (int i = 0; i < NameSurnameTemp.Length; i++)
    {
        if (i < NameSurnameTemp.Length - 1)
        {
            if (!string.IsNullOrEmpty(NameSurname[0]))
                NameSurname[0] += " " + NameSurnameTemp[i];
            else
                NameSurname[0] += NameSurnameTemp[i];
        }
        else
            NameSurname[1] = NameSurnameTemp[i];
    }
    return NameSurname;
}

0
“宁愿晚一点,也不要什么都没有。这是我在许多应用程序中使用的解决方案。”
 string fullName = "John De Silva";
 string[] names = fullName.Split(" ");
 string firstName = names.First(); // John
 string lastName = string.Join(" ", names.Skip(1).ToArray()); // De Silva

享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接