4

私のためにこれを達成するかもしれないC#の素晴らしい正規表現またはメソッドはありますか?

誰かが「フルネーム」フィールドに文字列を入力しました。私はそれを次のように分割する必要があります。タイトル名ミドルサーネームサフィックス

ただし、ユーザーは「John Smith」と入力できるため、JohnをFirst Nameに、SmithをSurnameに入力する必要があります。ジョン・スミス氏(既知のタイトルとサフィックスのリストがあります)と入力できるため、最初の文字列がタイトルの場合は、[タイトル]フィールドに入力されます。

完璧な例は次のとおりです。

ジョン・キャンベル・スミス・ジュニア氏

しかし、彼らは持つことができます:

ジョン夫妻とメアリー・スミス

したがって、タイトルはMr and Mrs、名はJohn and Mary、名前はSmithになります(ジョイナーとして「And」または「&」のいずれかを使用できます)

これは正規表現には複雑すぎると思いますが、誰かがアイデアを持っていることを期待していましたか?

4

1 に答える 1

6

さて、これが私があなたのために仕事をするだろうと思うプログラムです。もちろん、私はあなたの質問に基づいていくつかの仮定をしたので、あなたはいくつかの修正をしなければならないかもしれませんが、これは確かにあなたが正しい方向に始めるのに役立つはずです。

それらの仮定のいくつかは次のとおりです。

  1. 関数に指定された名前に句読点はありません(たとえば、ピリオド付きのJr.)。
  2. 姓名が必要ですが、タイトル、ミドルネーム、サフィックスはオプションです
  3. 質問で述べたように、結合演算子はandだけです。
  4. 名前はこの形式です{titles}{firstname} {middle name} {lastname}{suffix}

私はそれにたくさんの異なる名前を投げました、しかし確かにもっと多くの可能性があります、私はこれに30分以上費やさなかったのでそれは完全にテストされていません

class Program
{
    static List<string> _titles = new List<string> { "Mr", "Mrs", "Miss" };
    static List<string> _suffixes = new List<string> { "Jr", "Sr" };

    static void Main(string[] args)
    {
        var nameCombinations = new List<string>
        {
            "Mr and Mrs John and Mary Sue Smith Jr",
            "Mr and Mrs John and Mary Smith Jr",
            "Mr and Mrs John and Mary Sue Smith",
            "Mr and Mrs John and Mary Smith",
            "Mr and Mrs John Smith Jr",
            "Mr and Mrs John Smith",
            "John Smith",
            "John and Mary Smith",
            "John and Mary Smith Jr",
            "Mr John Campbell Smith Jr",
            "Mr John Smith",
            "Mr John Smith Jr",
        };

        foreach (var name in nameCombinations)
        {
            Console.WriteLine(name);

            var breakdown = InterperetName(name);

            Console.WriteLine("    Title(s):       {0}", string.Join(", ", breakdown.Item1));
            Console.WriteLine("    First Name(s):  {0}", string.Join(", ", breakdown.Item2));
            Console.WriteLine("    Middle Name:    {0}", breakdown.Item3);
            Console.WriteLine("    Last Name:      {0}", breakdown.Item4);
            Console.WriteLine("    Suffix:         {0}", breakdown.Item5);

            Console.WriteLine();
        }

        Console.ReadKey();
    }

    static Tuple<List<string>, List<string>, string, string, string> InterperetName(string name)
    {
        var segments = name.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        List<string> titles = new List<string>(),
            firstNames = new List<string>();
        string middleName = null, lastName = null, suffix = null;
        int segment = 0;

        for (int i = 0; i < segments.Length; i++)
        {
            var s = segments[i];

            switch (segment)
            {
                case 0:
                    if (_titles.Contains(s))
                    {
                        titles.Add(s);
                        if (segments[i + 1].IsJoiner())
                        {
                            i++;
                            continue;
                        }

                        segment++;
                    }
                    else
                    {
                        segment++;
                        goto case 1;
                    }

                    break;
                case 1:
                    firstNames.Add(s);
                    if (segments[i + 1].IsJoiner())
                    {
                        i++;
                        continue;
                    }

                    segment++;

                    break;
                case 2:
                    if ((i + 1) == segments.Length)
                    {
                        segment++;
                        goto case 3;
                    }
                    else if ((i + 2) == segments.Length && _suffixes.Contains(segments[i + 1]))
                    {
                        segment++;
                        goto case 3;
                    }

                    middleName = s;
                    segment++;

                    break;
                case 3:
                    lastName = s;
                    segment++;

                    break;
                case 4:
                    if (_suffixes.Contains(s))
                    {
                        suffix = s;
                    }

                    segment++;

                    break;
            }
        }

        return new Tuple<List<string>, List<string>, string, string, string>(titles, firstNames, middleName, lastName, suffix);
    }
}

internal static class Extensions
{
    internal static bool IsJoiner(this string s)
    {
        var val = s.ToLower().Trim();
        return val == "and" || val == "&";
    }
}
于 2012-10-17T01:58:28.437 に答える