我正在寻找如何摆脱异常“索引超出了数组的范围。”对于以下案例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];
}
答案 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 : "" ;
但这是一个极其错误的假设,即给定的名称只包含一个单词。我可以想到许多相反的例子,例如(但绝不限于):
如果不问问有关人员,就没有真正的方法可以知道。 “玛丽贝丝琼斯”是由一个给定的,中间的和姓氏组成的,还是由一个名字玛丽贝丝和一个名为“琼斯”的名字组成。
如果您正在考虑讲英语的文化,通常的惯例是,可能会有一个名字(名字)后跟姓氏(姓氏)。例如,英国皇冠的继承人查尔斯王子带着相当沉重的查尔斯菲利普亚瑟·乔治·蒙巴顿 - 温莎。严格来说,他没有姓氏。当需要一个人使用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;
}