web-dev-qa-db-fra.com

Comment séparer la chaîne du nom complet en chaîne du prénom et du nom de famille?

J'ai besoin d'aide avec ceci, j'ai une chaîne de nom complet et ce que je dois faire est de séparer et utiliser cette chaîne de nom complet en tant que prénom et nom de famille séparément. 

23
user773456

Cela fonctionnera si vous êtes sûr d'avoir un prénom et un nom de famille.

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

Assurez-vous de vérifier la longueur de 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

Mettre à jour

Bien entendu, il s’agit d’une vision plutôt simplifiée du problème. L'objectif de ma réponse est d'expliquer comment fonctionne string.Split(). Cependant, vous devez garder à l'esprit que certains noms de famille sont des noms composites, comme "Luis da Silva", comme l'a noté @AlbertEin. 

C'est loin d'être un problème simple à résoudre. Certaines prépositions (en français, espagnol, portugais, etc.) font partie du nom de famille. C'est pourquoi John Saunders a demandé "quelle langue?". John a également noté que les préfixes (M., Mme) et les suffixes (Jr., III, M.D.) pourraient gêner.

36
Adrian Carneiro

Vous pouvez essayer de l'analyser en utilisant des espaces mais cela ne fonctionnera pas. Exemple:

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

Mais cela échouerait avec une tonne d’informations d’utilisateur. Qu'en est-il s’il a deux noms? "Juan Pablo Perez". 

Les noms sont des choses compliquées, il est donc impossible de toujours savoir quelle partie est le prénom et le nom d'une chaîne donnée.

MODIFIER

Vous ne devez pas utiliser la méthode string.Split pour extraire le nom de famille. Certains noms de famille sont composés d'au moins deux mots. Par exemple, le nom d'un de mes amis est "Ponce de Leon".

12
albertein

Cette solution fonctionnera pour les personnes dont le nom de famille comporte plusieurs mots. Traite le premier mot comme prénom et laisse tout le reste comme nom de famille.

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

Par exemple, passer Brian De Palma à la fonction ci-dessus renvoie "De Palma, Brian"

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

Essayer:

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

Vous pouvez utiliser cette version (MSDN) de la méthode Split comme suit:

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

Dans ce cas, split[0] sera John et split[1] sera Deo. un autre exemple:

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

Dans ce cas, split[0] sera John et split[1] sera Wesley Doe.

Notez que la longueur de split ne doit jamais dépasser 2

Donc, avec le code suivant, vous pouvez obtenir FirstName et LastName agréablement:

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

J'espère que cette réponse ajoutera quelque chose d'utile à cette page. 

4
Mehdi Dehghani

Il existe plusieurs implémentations d’analyser/diviser les noms sur nuget. Si vous plongez dans le référentiel NameParserSharp, vous pouvez également combiner deux classes partielles et les copier/coller dans votre propre bibliothèque.

NameParserSharp

Plus chez Nuget

3
James White

Je recommanderais d’utiliser un Regex pour définir de manière rigoureuse l’apparence de votre prénom et de votre nom.

2
Kongress

Voici un morceau de code c # que j'utilise dans mes projets. Il retourne le dernier mot comme nom de famille et le reste comme nom.

Fiddle

Sortie:

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

P.S. Pas de deuxième prénom, désolé.

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;
}
1
Bonus Kun

Est-ce aussi simple que d’appeler string.Split () , en passant un seul espace comme caractère divisé? Ou y a-t-il quelque chose de plus délicat qui se passe ici? (Si ce dernier cas, veuillez mettre à jour votre question avec plus d’informations.)

0
mikemanne

pour les cas d'utilisation élémentaires, il est facile de scinder simplement 'ou', cependant, en raison de la diversité des noms comportant des éléments différents, cela ne fonctionnera pas toujours.

0
m4tt1mus
0
stokito

Donc, si vous prenez le premier espace comme nom et que vous vous reposez comme nom de famille, cela nous donnera

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
Ggalla1779

Un code simple et facile pour transformer quelque chose comme Flowers, Love à Love Flowers (cela fonctionne avec des noms très complexes comme 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() + " "}");
        } 

sortie : Love Flowers

L'inverse. Amour Fleurs converties en Fleurs, Amour:

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