如何将全名字符串分隔为firstname和lastname字符串?

我需要一些帮助,我有一个全名字符串,我需要做的是分开并分别使用这个fullname字符串作为firstname和lastname。

如果您确定您有名字和姓氏,这将有效。

 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()工作原理。 但是,你必须记住,一些姓氏是复合名称,如@AlbertEin所指出的“Luis da Silva”。

这远非一个简单的问题需要解决。 一些介词(法语,西class牙语,葡萄牙语等)是姓氏的一部分。 这就是@John Saunders问“用什么语言?”的原因。 约翰还指出,前缀(先生,夫人)和后缀(Jr.,III,MD)可能会妨碍前进。

您可以尝试使用空格解析它,但它不会起作用,例如:

 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”。

尝试:

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

此解决方案适用于姓氏有多个单词的人。 将第一个单词视为名字,并将其他所有内容作为姓氏。

 public static string getLastNameCommaFirstName(String fullName) { List 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" 

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

NameParserSharp

更多Nuget

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

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

在这种情况下, split[0]将是Johnsplit[1]将是Deo 。 另一个例子:

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

在这种情况下, split[0]将是Johnsplit[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]; } 

希望这个答案为这个页面添加一些有用的东西

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

这是我在项目中使用的一段c#代码。 它将最后一个单词作为姓氏返回,其余单词作为名称返回。

小提琴

输出:

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

PS没有中间名,抱歉。

 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; } 

这是否像调用string.Split()一样简单,将单个空格作为拆分字符传递? 或者这里有什么比较棘手的事情? (如果是后者,请用更多信息更新您的问题。)

对于基本用例,它很容易拆分为”或’,’然而由于各种不同的名称,这种情况并不总是有效。

您可以尝试移植此PHP库https://github.com/joshfraser/PHP-Name-Parser/blob/master/parser.php

因此,如果你把第一个空格作为名字并作为姓氏rest,这将给我们

 Person myPerson = new Person(); Misc tidyup = new Misc(); string[] result = tidyup.SplitFullName(tb1.Text); foreach (string s in result) { Console.WriteLine(s); if (result.First() == s) { myPerson.FirstName = s; } else { myPerson.LastName += s + " "; Console.WriteLine(s); Console.WriteLine(myPerson.LastName); } } public string[] SplitFullName(string myName) { string[] names = myName.Split(' '); //string firstName = names[0]; //string lastName = names[1]; return names; }