如何将全名字符串分割成名字和姓氏字符串?

40

我需要帮助处理这个问题,我有一个包含完整名字的字符串,需要将其分离并将其作为名和姓分别使用。


12
用哪种语言?英语?您想如何处理中间名?您想如何处理“先生”、“小”或“胡安·加西亚·洛佩兹博士小”这样的称呼? - John Saunders
你有分隔符吗? "Edimar*Lima",* = 分隔符 - Tocco
1
如果您不展示实际字符串的样子,我们很难提供帮助。 - Gabe
正如John所指出的,名称可能会很棘手。根据您的用例,最好要么避免拆分名称,要么设计您的UI以便用户自行拆分。 - hammar
21个回答

0

你可以创建一个值对象来表示名称,并在应用程序中使用它

public class Name
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string FullName { get; }

    public Name(string name)
    {
        if (string.IsNullOrEmpty(name))
            return;

        FullName = name;

        LoadFirstAndLastName();
    }

    private void LoadFirstAndLastName()
    {
        var names = FullName.Trim().Split(" ", 2);

        FirstName = names.First();

        if (names.Count() > 1)
            LastName = names.Last();
    }

    public override string ToString() => FullName;

    //Enables implicit set (Name name = "Rafael Silva")
    public static implicit operator Name(string name) => new Name(name);
}

用法:

Name name = "Jhon Doe"; //FirstName = Jhon - LastName = Doe
Name name = new Name("Jhon Doe"); //FirstName = Jhon - LastName = Doe    
Name name = new Name("Rafael Cristiano da Silva"); //FirstName = Rafael - LastName = Cristiano da Silva

//On class property
public Name Name {get; set; } = "Jhon Doe";

"Split(" ", 2)" 应该改为 "Split(' ', 2)",因为它需要一个字符作为参数,而不是一个字符串。 - Jason Geiger

0
这是我的扩展程序。它将最后一个单词作为姓氏,其余内容作为名字返回。
public static void SplitFullName(this string fullName, out string firstName, out string lastName)
{
    firstName = string.Empty;
    lastName = string.Empty;
    if (!string.IsNullOrEmpty(fullName))
    {

        lastName = string.Empty; firstName = string.Empty;
        int splitIndex = fullName.LastIndexOf(' ');
        if (splitIndex >= 0)
        {
            firstName = fullName.Substring(0, splitIndex);
            lastName = fullName.Substring(splitIndex + 1);
        }
        else
            firstName = fullName;
    }

}

使用方法:

"Micheal".SplitFullName(out string first, out string last);
// first = "Micheal"
// last = ""

"Micheal Jackson".SplitFullName(out string first, out string last);
// first = "Micheal"
// last = "Jackson"

"Micheal Joseph Jackson".SplitFullName(out string first, out string last);
// first = "Micheal Joseph"
// last = "Jackson"

顺便提一下,Visual Studio Intellisense 真是太强大了!我只写了到 if 条件,剩下的代码都被 Intellisense 自动完成了。


0

0
这是否就像调用string.Split(),将单个空格作为分隔符一样简单?还是有更棘手的问题存在?(如果是后者,请在您的问题中更新更多信息。)

0
对于基本用例,可以轻松地在“”或“,”上拆分,但由于名称的多样性和不同元素,这种方法并不总是适用。

0
Sub SplitFullName(Full_Name As String)

        Dim names = Full_Name.Split(" ")
        Dim FirstName As String = ""
        Dim MiddletName As String = ""
        Dim LastName As String = ""
        If names.Count = 0 Then
            FirstName = ""
            MiddletName = ""
            LastName = ""
        ElseIf names.Count = 1 Then
            FirstName = names(0)
        ElseIf names.Count = 2 Then
            FirstName = names(0)
            LastName = names(1)
        Else
            FirstName = names(0)
            For i = 1 To names.Count - 2
                MiddletName += " " & names(i)
            Next
            LastName = names(names.Count - 1)
        End If
        MsgBox("The first name is: " & FirstName & ";   The middle name is: " & MiddletName & ";    The last name is: " & LastName)

End Sub

完美运行 - Zeshan

0

如果您将第一个空格作为名字,其余部分作为姓氏,那么这将给我们

Person myPerson = new Person();

Misc tidyup = new Misc();
string[] result = tidyup.SplitFullName(tb1.Text);

foreach (string s in result)
{
    Console.WriteLine(s);

    if (result.First() == s)
    {
        myPerson.FirstName = s;
    }
    else
    {
        myPerson.LastName += s + " ";
        Console.WriteLine(s);
        Console.WriteLine(myPerson.LastName);
    }
}    

public string[] SplitFullName(string myName)
{
    string[] names = myName.Split(' ');
    //string firstName = names[0];
    //string lastName = names[1];

    return names;
}

0

简单易懂的代码,可以将类似于Flowers, Love的内容转换为Love Flowers(即使是像Williams Jones, Rupert John这样非常复杂的名字也可以):

        string fullname = "Flowers, Love";
        string[] fullnameArray = fullname.Split(",");//Split specify a separator character, so it's removed
        for (int i = fullnameArray.Length - 1; i >= fullnameArray.Length - 2; i--)
        {
                Write($"{fullnameArray[i].TrimStart() + " "}");
        } 

输出: 爱花

反过来。爱花转换为花,爱:

        string fullname = "Love Flowers";
        int indexOfTheSpace = fullname.IndexOf(' ');
        string firstname = fullname.Substring(0, indexOfTheSpace);
        string lastname = fullname.Substring(indexOfTheSpace + 1);
        WriteLine($"{lastname}, {firstname}");

0

有不止一种方法可以解决这个问题。我的具体情况可以通过以下代码示例来解决。

例如


如果用户的名字中只有一个空格。
 int idx = fullName.IndexOf(' '); //This customer name : Osman Veli

如果用户的名字中有超过一个空格。
 if (fullName.Count(Char.IsWhiteSpace) > 1)
 {
    idx = fullName.LastIndexOf(' '); //This customer name : Osman Veli Sağlam
 }

  if (idx != -1)
  {
    // Osman Veli Sağlam
    firstName = fullName.Substring(0, idx); // FirstName: Osman Veli 
    lastName = fullName.Substring(idx + 1); // LastName : Sağlam
   }

0
我已经添加了一些检查以获得所需的结果。例如,其他解决方案可以工作,但是当我有意地取两个空格时它不能工作,所以这里是解决方法。
final name = ' sambhav';
final words = name.trim().split(' ');
final firstName = words[0];
final lastName = words.length > 1 ? words[words.length - 1] : '';
print('first name : $firstName, last name : $lastName');

结果

input : Sambhav jain // first name : Sambhav, last name : jain    
input : Sambhav the jain // first name : Sambhav, last name : jain  
input : Sambhav // first name : Sambhav, last name :

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接