4

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

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

情况1:

姓名:约翰·梅尔维克

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

案例二:

姓名:肯尼迪

如果两个我得到一个错误 Index is out of range at LastName in my code

案例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];
}
4

6 回答 6

11

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

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

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

if (names.Length == 1) {
  FirstName = "";
  LastName = names[0];
} else {
  FirstName = names[0];
  LastName = names[1];
}
于 2013-10-14T23:58:46.123 回答
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 : "" ;

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

  • 比利雷(如“比利雷赛勒斯”的早期示例)
  • 玫琳凯
  • 玛丽贝丝

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

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

于 2013-10-15T01:04:28.683 回答
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

有关更多信息,请参阅此答案

于 2013-10-14T23:54:05.090 回答
0

采用

String.indexof(" ")

string.lastindexof(" ")

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

编辑

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

于 2013-10-14T23:54:05.887 回答
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 + " ";
    }
  }
} 
于 2013-10-14T23:55:56.827 回答
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;

   }
于 2015-01-29T08:09:47.073 回答