Подтвердить что ты не робот

Как отделить полную строку имени от имени и фамилии?

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

4b9b3361

Ответ 1

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

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(). Однако вы должны помнить, что некоторые фамилии являются составными именами, такими как "Luis da Silva", как отмечает @AlbertEin.

Это далеко не простая проблема для решения. Некоторые предлоги (на французском, испанском, португальском и т.д.) Являются частью фамилии. Вот почему @Джон Сандерс спросил "какой язык?". Джон также отметил, что префиксы (г-н, г-жа) и суффиксы (младший, III, M.D.) могут мешать.

Ответ 2

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

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

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

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

ИЗМЕНИТЬ

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

Ответ 3

Try:

  string fullName = "The mask lol"; 
    string[] names = fullName.Split(' '); 
    string name = names.First();
    string lasName = names.Last(); 

Ответ 4

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

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

Для примера прохождение Брайана Де Пальмы в указанную выше функцию вернет "Де Пальма, Брайан"

getLastNameFirst("Brian De Palma");
//returns "De Palma, Brian"

Ответ 5

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

NameParserSharp

Подробнее в Nuget

Ответ 6

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

Ответ 7

Вы можете использовать эту версию (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];
}

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

Ответ 8

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

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

Ответ 9

Это так же просто, как вызов string.Split(), передавая единое пространство как разделительный символ? Или здесь что-то сложнее? (Если последний, пожалуйста, обновите свой вопрос с дополнительной информацией.)

Ответ 10

для основных случаев использования его легко разделить на "или", однако из-за разнообразия имен с разными вещами в них это не всегда будет работать.

Ответ 12

Итак, если вы возьмете первое пространство как имя и останетесь как фамилия, это даст нам

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