0

我正在研究一种方法,该方法接受一个字符串并将其分成多个项目,然后将其存储在一个数组中。然后我执行检查以查看数组是否包含两个以上的项目,如果包含,我将数组中的特定项目分配给相应的字符串,即将第一项分配给名字,最后一项分配给姓氏,所有其他项目分配给中间名。

我的问题涉及检索数组中不是第一个或最后一个项目的每个项目,然后以正确的顺序将它们分配给一个字符串。下面你可以看到我试图抓取名称数组中的每个项目并将结果分配给一个列表,然后可以将其转换为单个字符串,但没有运气。我正在寻找的是解决这个问题的方法。

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

5 回答 5

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”。如果您想要“Jack, Willis”,请使用“,”作为分隔符。

于 2013-09-10T10:50:37.367 回答
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+。它可以选择将它们之间发生的任何其他内容与 pattern匹配(?:(.*?)(?:\s+)?),其中重要部分是(.*?)(匹配任何内容,非贪婪,以免在姓氏前咀嚼任何空格),其余大部分是繁文缛节(非捕获组,姓氏前的可选空格)。

于 2013-09-10T10:57:06.117 回答
2

这会将所有中间名添加到以空格分隔的中间名并修剪最后一个空格

for (int i = 1; i < name.Length - 1; i++)
{
    middlename+=name[i]+" ";
}
middlename = middlename.Trim(); // just for sure

如果您需要其他内容,请说明您的问题

如果你的名字是

aa bb cc dd ee

中间名将是

bb cc dd

于 2013-09-10T10:49:16.530 回答
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;
}

但这会返回完全相同的字符串。

于 2013-09-10T10:51:45.230 回答
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;
    }
于 2013-09-10T10:52:12.403 回答