【问题标题】:How to separate a first name and last name in c#?如何在c#中分隔名字和姓氏?
【发布时间】:2013-10-22 15:50:18
【问题描述】:

我正在寻找如何摆脱以下异常“索引超出数组范围”。对于以下情况2

目的:区分名字和姓氏(姓氏有时可能为空)

案例 1:

姓名:约翰·梅尔维克

我可以用我的代码解决第一个案例

案例 2:

姓名:肯尼迪

如果两个我收到错误,我的代码中 LastName 的索引超出范围

案例 3:

姓名:鲁道夫·尼克·博瑟

情况3,我可以得到:

名字:Rudolph 和姓氏:Nick(而我需要 Nick Bother 一起成为姓氏)

非常感谢,如果有人帮助我。

代码如下:

Match Names = Regex.Match(item[2], @"(((?<=Name:(\s)))(.{0,60})|((?<=Name:))(.{0,60}))", RegexOptions.IgnoreCase);

if (Names.Success)
{
    FirstName = Names.ToString().Trim().Split(' ')[0];                      
    LastName = Names.ToString().Trim().Split(' ')[1];
}

【问题讨论】:

  • 这里已经回答了:stackoverflow.com/questions/6629136/…
  • 投票结束,与上述重复。
  • 你怎么知道第一个字符串是名字,其他字符串是姓氏?例如,有一个名叫比利·雷·赛勒斯的人……名字:比利·雷,姓氏:赛勒斯。
  • @Matthew 我不确定名字,姓氏..但这是该人提出的要求,他们将考虑在名字之后剩下的部分将仅是姓氏。我正在检查这里是否有任何可选代码...

标签: c# asp.net c#-4.0


【解决方案1】:

这里是这个问题最通用的解决方案。

public class NameWrapper
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public NameWrapper()
    {
        this.FirstName = "";
        this.LastName = "";
    }
}
 public static NameWrapper SplitName(string inputStr, char splitChar)
   {
       NameWrapper w = new NameWrapper();
       string[] strArray = inputStr.Trim().Split(splitChar);
       if (string.IsNullOrEmpty(inputStr)){
           return w;
       }


       for (int i = 0; i < strArray.Length; i++)
       {
           if (i == 0)
           {
               w.FirstName = strArray[i];
           }
           else
           {
               w.LastName += strArray[i] + " ";
           }
       }
       w.LastName = w.LastName.Trim();

       return w;

   }

【讨论】:

  • 对于Surnames ?
【解决方案2】:

修改代码如下:

Match Names = Regex.Match(item[2], @"(((?<=Name:(\s)))(.{0,60})|((?<=Name:))(.{0,60}))", RegexOptions.IgnoreCase);

if (Names.Success)
{
  String[] nameParts =  Names.ToString().Trim().Split(' ');
  int count = 0;
  foreach (String part in nameParts) {
    if(count == 0) {
      FirstName = part;
      count++;
    } else {
      LastName += part + " ";
    }
  }
} 

【讨论】:

    【解决方案3】:

    这样的工作:

    string name = "Mary Kay Jones" ;
    Regex rxName = new Regex( @"^\s*(?<givenName>[^\s]*)(\s+(?<surname>.*))?\s*$") ;
    Match m = rxName.Match( name ) ;
    
    string givenName = m.Success ? m.Groups[ "givenName" ].Value : "" ;
    string surname   = m.Success ? m.Groups[ "surname"   ].Value : "" ;
    

    但是,一个给定的名称仅由一个单词组成是一个极其错误的假设。我能想到很多相反的例子,比如(但绝不限于):

    • Billy Ray(如前面的“Billy Ray Cyrus”示例)
    • 玫琳凯
    • 玛丽·贝丝

    如果不询问相关人员,就没有真正的方法可以知道。 “Mary Beth Jones”是由一个给定的、中间名和姓氏组成的,还是由一个给定的名字、Mary Beth 和一个姓氏“Jones”组成的。

    如果您正在考虑讲英语的文化,通常的约定是一个人可能有多个名字(名),后跟一个姓(姓)。例如,英国王室继承人查尔斯王子携带着相当重型的查尔斯菲利普亚瑟乔治蒙巴顿温莎。严格来说,他没有姓氏。 Mountbatten-Windsor 在需要时使用,他的全名只是“Charles Phillip Arthur George”。

    【讨论】:

      【解决方案4】:

      通过限制要返回的子字符串的数量来拆分字符串。这会将第一个空格之后的所有内容作为姓氏保留在一起:

      string[] names = Names.ToString().Trim().Split(new char[]{' '}, 2);
      

      然后检查数组的长度来处理只有姓氏的情况:

      if (names.Length == 1) {
        FirstName = "";
        LastName = names[0];
      } else {
        FirstName = names[0];
        LastName = names[1];
      }
      

      【讨论】:

        【解决方案5】:

        使用

        String.indexof(" ")
        

        string.lastindexof(" ")
        

        如果它们匹配,则有一个空格。如果他们没有 2。我相信如果没有匹配项,它会返回 0。希望这会有所帮助

        编辑

        如果你使用索引,你可以使用它们做一个子字符串,并得到你想要的姓氏

        【讨论】:

          【解决方案6】:
          string fullName = "John Doe";
          var names = fullName.Split(' ');
          string firstName = names[0];
          string lastName = names[1];
          

          您收到错误的原因是您没有检查名称的长度。

          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
          

          更多信息请参见this answer

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多