【问题标题】:How to separate full name string into firstname and lastname string?如何将全名字符串分成名字和姓氏字符串?
【发布时间】:2011-10-01 12:43:21
【问题描述】:

我需要一些帮助,我有一个全名字符串,我需要做的是单独使用这个全名字符串作为名字和姓氏。

【问题讨论】:

  • 使用哪种语言?英语?你想用中间名做什么?你想对“先生”做什么?和“小”还是“Juan D. Garcia y Lopez Jr. 博士,医学博士”?
  • 你有分隔符吗? "Edimar*Lima", * = separator
  • 如果您不向我们展示您的实际字符串是什么样的,我们无能为力。
  • 正如约翰指出的那样,名称可能很棘手。根据您的用例,最好避免拆分名称或设计您的 UI,以便您的用户自己进行拆分。

标签: c# string string-parsing


【解决方案1】:

如果您确定自己有名字和姓氏,这将起作用。

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

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

【讨论】:

  • 我想要这样,不是吗?虽然不是...... :(但我很高兴这不是“糟透了”:)
  • 代码有错误。我修好了它。否决者,请修改。
  • "names.Length > 2 //在索引 0 处是名字。在索引 Length-1 处,是姓氏。":这不是真的!,可能没有中间名但有一个姓氏由多个单词组成。
  • @Adrian 例如“Pedro de la Garza”,名字:“Pedro”,姓氏:“De la Garza”。 N
  • 如果名字是“Juan Carlos”两者都是名字的一部分
【解决方案2】:

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

var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);

但这会因大量用户输入而失败,如果他确实有两个名字呢? “胡安·巴勃罗·佩雷斯”。

名字是复杂的东西,所以不可能总是知道给定字符串中名字和姓氏的哪一部分。

编辑

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

【讨论】:

  • 可能应该更改您的代码以使用 split 方法,但是您提到了另一个我不同意的内容。
  • 拆分的问题在于,如果您的姓氏包含空格,您将丢失部分名称。例如,我的一个朋友姓“Ponce de leon”
  • 这远非一个简单的问题。想要一些样品吗?托马斯·阿尔瓦·爱迪生:姓不是阿尔瓦·爱迪生。庞塞德莱昂:姓德莱昂。你怎么知道?因为介词“de”。有“de”、“da”等。
  • @Adrian 你错了,“Ponce de Leon”是姓氏,而不是“de Leon”。事实上,不可能以任何可靠的方式做 OP 要求的事情
  • 这应该是公认的答案。它的工作原理与中间名的数量无关。
【解决方案3】:

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

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"

【讨论】:

  • 这不适用于中间名或名字中包含空格的任何人
  • @Rachel613 这可能是真的,但名字中带有空格的名字数量很少。总的来说,这种方式可以更好地适应大多数情况。
【解决方案4】:

试试:

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

【讨论】:

  • 为什么不string name = names.First();
  • 这是邪恶的解决方案.. JOhn Van Meter 其中“Van Meter”是姓氏。你的解决方案将彻底搞砸姓氏
  • @user384080:它执行用户请求的操作。它将名字和姓氏分开,只考虑它们被分成空格。他没有提到要考虑任何其他事情,例如,它被分成不同的语言。
  • @Filburt:已编辑。抱歉有点晚了:)
【解决方案5】:

您可以使用this version (MSDN)Split 方法,如下所示:

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

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

【讨论】:

    【解决方案6】:

    我建议使用Regex 来严格定义您的名字和姓氏的样子。

    【讨论】:

      【解决方案7】:

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

      NameParserSharp

      More at Nuget

      【讨论】:

        【解决方案8】:

        name ="托尼·史塔克死了";

        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
          }
        

        【讨论】:

          【解决方案9】:

          这是我在项目中使用的一段 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;
          }
          

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              对于基本用例,很容易将其拆分为 ' ' 或 ', ',但是由于名称多种多样,其中包含不同的内容,这并不总是有效。

              【讨论】:

                【解决方案12】:

                【讨论】:

                  【解决方案13】:

                  所以如果你把第一个空格作为名字,其余作为姓氏,这会给我们

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

                  【讨论】:

                    【解决方案14】:

                    简单的代码,可以将 Flowers, Love 之类的内容转换为 Love Flowers(这适用于非常复杂的名称,例如 Williams Jones, Rupert John强>):

                            string fullname = "Flowers, Love";
                            string[] fullnameArray = fullname.Split(",");//Split specify a separator character, so it's removed
                            for (int i = fullnameArray.Length - 1; i >= fullnameArray.Length - 2; i--)
                            {
                                    Write($"{fullnameArray[i].TrimStart() + " "}");
                            } 
                    

                    输出:爱花

                    反过来。爱花转成花,爱:

                            string fullname = "Love Flowers";
                            int indexOfTheSpace = fullname.IndexOf(' ');
                            string firstname = fullname.Substring(0, indexOfTheSpace);
                            string lastname = fullname.Substring(indexOfTheSpace + 1);
                            WriteLine($"{lastname}, {firstname}");
                    

                    【讨论】:

                      【解决方案15】:

                      有不止一种方法可以做到这一点。我的具体情况通过如下代码示例解决。

                      举例


                      如果用户名中只有一个空格。

                       int idx = fullName.IndexOf(' '); //This customer name : Osman Veli
                      

                      如果用户名中有多个空格。

                       if (fullName.Count(Char.IsWhiteSpace) > 1)
                       {
                          idx = fullName.LastIndexOf(' '); //This customer name : Osman Veli Sağlam
                       }
                      
                        if (idx != -1)
                        {
                          // Osman Veli Sağlam
                          firstName = fullName.Substring(0, idx); // FirstName: Osman Veli 
                          lastName = fullName.Substring(idx + 1); // LastName : Sağlam
                         }
                      

                      【讨论】:

                        【解决方案16】:

                        您可以创建一个值对象来表示名称并在您的应用程序中使用它

                        public class Name
                        {
                            public string FirstName { get; private set; }
                            public string LastName { get; private set; }
                            public string FullName { get; }
                        
                            public Name(string name)
                            {
                                if (string.IsNullOrEmpty(name))
                                    return;
                        
                                FullName = name;
                        
                                LoadFirstAndLastName();
                            }
                        
                            private void LoadFirstAndLastName()
                            {
                                var names = FullName.Trim().Split(" ", 2);
                        
                                FirstName = names.First();
                        
                                if (names.Count() > 1)
                                    LastName = names.Last();
                            }
                        
                            public override string ToString() => FullName;
                        
                            //Enables implicit set (Name name = "Rafael Silva")
                            public static implicit operator Name(string name) => new Name(name);
                        }
                        

                        用法:

                        Name name = "Jhon Doe"; //FirstName = Jhon - LastName = Doe
                        Name name = new Name("Jhon Doe"); //FirstName = Jhon - LastName = Doe    
                        Name name = new Name("Rafael Cristiano da Silva"); //FirstName = Rafael - LastName = Cristiano da Silva
                        
                        //On class property
                        public Name Name {get; set; } = "Jhon Doe";
                        

                        【讨论】:

                          【解决方案17】:

                          迟到总比没有好,这是我在许多应用程序中使用的解决方案。

                           string fullName = "John De Silva";
                           string[] names = fullName.Split(" ");
                           string firstName = names.First(); // John
                           string lastName = string.Join(" ", names.Skip(1).ToArray()); // De Silva
                          

                          享受吧!

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-01-07
                            • 2016-11-11
                            • 1970-01-01
                            • 2020-12-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多