如何在c#中分隔名字和姓氏?

时间:2013-10-14 23:49:07

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

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

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

案例1:

姓名:John Melwick

我可以用我的代码

解决第一个案例

案例2:

姓名:肯尼迪

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

案例3:

姓名:Rudolph Nick Bother

在案例3中,我可以得到:

FirstName:Rudolph和LastName: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];
}

6 个答案:

答案 0 :(得分:11)

拆分字符串,并限制要返回的子字符串数。这会将第一个空格后的所有内容保存在一起作为姓氏:

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

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

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

答案 1 :(得分:1)

这样的工作:

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 Kay
  • Mary Beth

如果不问问有关人员,就没有真正的方法可以知道。 “玛丽贝丝琼斯”是由一个给定的,中间的和姓氏组成的,还是由一个名字玛丽贝丝和一个名为“琼斯”的名字组成。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用

String.indexof(" ")

string.lastindexof(" ")

如果匹配则有一个空格。如果他们不存在2.我认为如果没有匹配则返回0。希望这有帮助

修改

如果您使用索引,则可以使用它们来执行子字符串并获取您想要的姓氏

答案 4 :(得分:0)

将代码修改为:

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

答案 5 :(得分:0)

以下是此问题的最通用解决方案。

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;

   }