我正在研究一种方法,它接受一个字符串并将其分成多个项目,然后将其存储在一个数组中。然后我执行检查以查看数组是否包含两个以上的项目,如果是,我将数组中的特定项目分配给相应的字符串,即将第一个项目分配给forename,将最后一个项目分配给surname,将所有其他项目分配给中间名称。
我的问题涉及检索数组中不是第一个或最后一个项目的每个项目,然后以正确的顺序将它们分配给字符串。下面你可以看到我试图抓取名称数组中的每个项目,并将结果分配给一个列表,然后可以将其转换为单个字符串,但没有运气。我正在寻找的是解决这个问题的方法。
public string SplitName(string text)
{
string forename;
string middlename;
string surname;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
List<string> temp = new List<string>();
for (int i = 1; i < name.Length - 1; i++)
{
// Assign each item to middlename
}
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
答案 0 :(得分:6)
使用String.Join(http://msdn.microsoft.com/en-us/library/tk0xe5h0.aspx)
public string SplitName(string text)
{
string forename;
string middlename;
string surname;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
middlename = string.Join(" ", name, 1, name.Length - 2);
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
如果希望使用不同的字符串连接它们,请更改连接的第一个参数(“”)。目前,名称“Bob Jack Willis Mills”将创建一个中间名“Jack Willis”。如果你想“杰克,威利斯”使用“,”作为分隔符。
答案 1 :(得分:3)
如果您只想分别保留第一个和最后一个令牌并将其他所有内容视为中间名,那么使用正则表达式会更简单:
var regex = new Regex(@"^(\S+)\s+(?:(.*?)(?:\s+)?)(\S+)$");
var match = regex.Match("foo bar baz");
if (match.Success) {
var firstName = match.Groups[1].Value;
var middleName = match.Groups[2].Value;
var lastName = match.Groups[3].Value;
}
else {
// there were no spaces, i.e. just one token
}
正则表达式在末尾与\S+
匹配两行非空格字符。它可选地匹配模式(?:(.*?)(?:\s+)?)
之间恰好位于它们之间的任何其他东西,其中重要部分是(.*?)
(匹配任何东西,非贪婪,以便不会在姓氏之前占据任何空格)其余的主要是繁文缛节(非捕获组,姓氏前的可选空格)。
答案 2 :(得分:2)
这会将所有中间名添加到以空格分隔的中间名并修剪最后一个空格
for (int i = 1; i < name.Length - 1; i++)
{
middlename+=name[i]+" ";
}
middlename = middlename.Trim(); // just for sure
如果您还需要其他内容,请指明您的问题
如果你的名字是
aa bb cc dd ee
midlename将是
bb cc dd
答案 3 :(得分:2)
试试这个:
public string SplitName(string text)
{
string forename;
string middlename;
string surname;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
middlename = string.Join(" ", name.Skip(1).Take(name.Length - 2));
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
但这会返回完全相同的字符串。
答案 4 :(得分:2)
首先,你需要初始化字符串变量,然后你可以将所有“中间”项附加到它。
public string SplitName(string text)
{
string forename = string.Empty;
string middlename = string.Empty;
string surname = string.Empty;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
List<string> temp = new List<string>();
for (int i = 1; i < name.Length - 1; i++)
{
middlename += name[i];
}
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}