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

本文关键字:分隔 | 更新日期: 2023-09-27 18:35:16

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

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

案例1:

姓名:约翰·梅尔威克

我可以用我的代码解决第一种情况

案例2:

姓名:肯尼迪

万一两个我收到错误 索引超出了我的代码中姓氏的范围

案例3:

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

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

名字:鲁道夫和姓氏:尼克(而我需要尼克一起成为姓氏)

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

这是代码:

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

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

拆分字符串,限制要返回的子字符串数。这会将第一个空格之后的任何内容保留为姓氏:

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

然后检查数组的长度以仅处理姓氏的大小写:

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

使用

String.indexof(" ")

string.lastindexof(" ")

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

编辑

如果您使用索引,您可以使用它们创建一个子字符串并根据需要获取姓氏

像这样的东西有效:

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 : "" ;
但是,一个

给定的名字只由一个单词组成,这是一个极其错误的假设。我可以想到许多相反的例子,例如(但不限于):

    比利
  • ·雷(如前面的"比利·雷·赛勒斯"的例子)
  • 玫琳凯
  • 玛丽·贝思

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

如果您正在考虑英语文化,通常的惯例是,一个人可以有尽可能多的名字(名字),然后是一个姓氏(姓氏)。例如,英国王室的继承人查尔斯王子携带相当沉重的查尔斯·菲利普·亚瑟·乔治·蒙巴顿-温莎。严格来说,他没有姓氏。蒙巴顿-温莎在需要的时候使用,他的全名只是"查尔斯·菲利普·亚瑟·乔治"。

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

有关详细信息,请参阅此答案。

将代码修改为如下所示:

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

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

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