web-dev-qa-db-ja.com

フルネームの文字列をファーストネームとラストネームの文字列に分ける方法は?

私はこれに関するいくつかの助けが必要です、私はフルネーム文字列を持っています、そして私がする必要があるのは別々で、このフルネーム文字列をファーストネームとラストネームとして別々に使用します。

24
user773456

これは、名と姓があることが確実な場合に機能します。

_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で指摘されているように、「Luis da Silva」のような合成名であることに留意する必要があります。

これは単純な解決すべき問題ではありません。いくつかの前置詞(フランス語、スペイン語、ポルトガル語など)は姓の一部です。 @John Saundersが「どの言語ですか?」と尋ねたのはそのためです。ジョンはまた、接頭辞(Mr.、Mrs。)と接尾辞(Jr.、III、M.D。)が邪魔になるかもしれないと述べました。

39
Adrian Carneiro

スペースを使用して解析することもできますが、機能しません。例:

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

しかし、それは大量のユーザー入力で失敗します。2つの名前がある場合はどうでしょうか。 「フアン・パブロ・ペレス」。

名前は複雑なものなので、特定の文字列のどの部分が姓と名であるかを常に把握することはできません。

[〜#〜] edit [〜#〜]

String.Splitメソッドを使用して姓を抽出しないでください。一部の姓は2つ以上の単語で構成されます。たとえば、私の友人の姓は「Ponce de Leon」です。

12
albertein

このソリューションは、複数のWordを持つ姓を持つ人に有効です。最初のWordを名として扱い、他のすべてを姓として残します。

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"
9
WiredIn

試してください:

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

このバージョン(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];
}

この回答がこのページに役立つものを追加することを願っています。

4
Mehdi Dehghani

Regex を使用して、姓と名がどのように見えるかを厳密に定義することをお勧めします。

3
Kongress

Nugetには、名前の解析/分割の実装がいくつかあります。 NameParserSharpリポジトリに飛び込む場合は、2つの部分クラスを組み合わせて、独自のライブラリにコピーして貼り付けることもできます。

NameParserSharp

Nugetの詳細

3
James White

プロジェクトで使用するc#コードの一部を次に示します。最後の単語を姓として、残りを名前として返します。

フィドル

出力:

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

追伸ミドルネームはありません、ごめんなさい。

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

これは string.Split() を呼び出して、単一のスペースを分割文字として渡すのと同じくらい簡単ですか?それともここで起こっているもっとトリッキーなことがありますか? (後者の場合は、質問を詳細情報で更新してください。)

0
mikemanne

基本的な使用例では、「」または「」で簡単に分割できますが、名前がさまざまであるため、それらが異なるため、常に機能するとは限りません。

0
m4tt1mus

これを移植してみることができますPHP lib https://github.com/joshfraser/PHP-Name-Parser/blob/master/parser.php

0
stokito

最初のスペースを名前、残りを姓とすると、次のようになります。

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

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

出力: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
laxcivo