Как разделить строку полного имени на строку имени и фамилии? - PullRequest
23 голосов
/ 08 июля 2011

Мне нужна помощь с этим, у меня есть строка с полным именем, и мне нужно сделать это отдельно и использовать эту строку с полным именем как имя и фамилия отдельно.

Ответы [ 13 ]

38 голосов
/ 08 июля 2011

Это будет работать, если вы уверены, что у вас есть имя и фамилия.

string fullName = "Adrian Rules";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];

Обязательно проверьте длину names.

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

Обновление

Конечно, это довольно упрощенный взгляд на проблему.Цель моего ответа - объяснить, как работает string.Split().Однако вы должны иметь в виду, что некоторые фамилии являются составными именами, такими как «Луис да Силва», как отмечает @AlbertEin.

Это далеко не простая проблема для решения.Некоторые предлоги (на французском, испанском, португальском и т. Д.) Являются частью фамилии.Вот почему @John Saunders спросил «на каком языке?».Джон также отметил, что префиксы (Mr., Mrs.) и суффиксы (Jr., III, MD) могут мешать.

13 голосов
/ 08 июля 2011

Вы можете попытаться разобрать его, используя пробелы, но это не сработает, например:

var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);

Но это не удастся с кучей пользовательского ввода, а что если у него два имени?"Хуан Пабло Перес".

Имена являются сложными вещами, поэтому невозможно всегда знать, какая часть является именем и фамилией в данной строке.

РЕДАКТИРОВАТЬ

Вы не должны использовать метод string.Split для извлечения фамилии, некоторые фамилии состоят из двух или более слов, например, фамилия моего друга "Понсе де Леон".

9 голосов
/ 28 апреля 2016

Это решение будет работать для людей, чья фамилия состоит из нескольких слов. Относитесь к первому слову как к первому имени и оставляйте все остальное как к фамилии.

public static string getLastNameCommaFirstName(String fullName) {
    List<string> names = fullName.Split(' ').ToList();
    string firstName = names.First();
    names.RemoveAt(0);

    return String.Join(" ", names.ToArray()) + ", " + firstName;            
} 

Например, передача Brian De Palma в вышеуказанную функцию вернет "De Palma, Brian"

getLastNameFirst("Brian De Palma");
//returns "De Palma, Brian"
8 голосов
/ 08 июля 2011

Попробуйте:

  string fullName = "The mask lol"; 
    string[] names = fullName.Split(' '); 
    string name = names.First();
    string lasName = names.Last(); 
4 голосов
/ 29 июня 2017

Вы можете использовать эту версию (MSDN) из Split, как описано ниже:

var testcase = "John Doe";
var split = testcase.Split(new char[] { ' ' }, 2);

В этом случае split[0] будет John, а split[1] будет Deo. другой пример:

var testcase = "John Wesley Doe";
var split = testcase.Split(new char[] { ' ' }, 2);

В этом случае split[0] будет John, а split[1] будет Wesley Doe.

Обратите внимание, что длина split никогда не должна превышать 2

Таким образом, с помощью следующего кода вы можете получить FirstName и LastName красиво:

var firstName = "";
var lastName = "";
var split = testcase.Split(new char[] { ' ' }, 2);
if (split.Length == 1)
{
    firstName = "";
    lastName = split[0];
}
else
{
    firstName = split[0];
    lastName = split[1];
}

Надеюсь, этот ответ добавит что-то полезное на эту страницу.

3 голосов
/ 04 февраля 2016

Существует несколько реализаций разбора / разделения имен в nuget.Если вы погрузитесь в репозиторий NameParserSharp, вы также можете просто объединить два частичных класса и скопировать и вставить их в свою собственную библиотеку.

NameParserSharp

Еще в Nuget

3 голосов
/ 08 июля 2011

Я бы рекомендовал использовать Regex , чтобы точно определить, как будут выглядеть ваши имя и фамилия.

1 голос
/ 11 февраля 2015

Вот фрагмент кода на c #, который я использую в своих проектах. Возвращает последнее слово как фамилию, а остальное как имя.

Fiddle

Выход:

Mary Isobel Catherine O’Brien
-------------------------
Name : Mary Isobel Catherine , Surname : O’Brien

P.S. Нет второго имени, извините.

public static string[] SplitFullNameIntoNameAndSurname(string pFullName)
{
    string[] NameSurname = new string[2];
    string[] NameSurnameTemp = pFullName.Split(' ');
    for (int i = 0; i < NameSurnameTemp.Length; i++)
    {
        if (i < NameSurnameTemp.Length - 1)
        {
            if (!string.IsNullOrEmpty(NameSurname[0]))
                NameSurname[0] += " " + NameSurnameTemp[i];
            else
                NameSurname[0] += NameSurnameTemp[i];
        }
        else
            NameSurname[1] = NameSurnameTemp[i];
    }
    return NameSurname;
}
0 голосов
/ 06 января 2019

Простой, простой код для преобразования чего-то вроде Цветы, Любовь в Любовь Цветы (это работает с очень сложными именами, такими как Уильямс Джонс, Руперт Джон ):

        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() + " "}");
        } 

вывод : Love Flowers

Наоборот.Любовь Цветы превращаются в Цветы, Любовь:

        string fullname = "Love Flowers";
        int indexOfTheSpace = fullname.IndexOf(' ');
        string firstname = fullname.Substring(0, indexOfTheSpace);
        string lastname = fullname.Substring(indexOfTheSpace + 1);
        WriteLine($"{lastname}, {firstname}");
0 голосов
/ 12 января 2017

Так что, если вы возьмете Первый пробел в качестве Имени и оставьте в качестве Фамилии, это даст нам

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