さて、これが私があなたのために仕事をするだろうと思うプログラムです。もちろん、私はあなたの質問に基づいていくつかの仮定をしたので、あなたはいくつかの修正をしなければならないかもしれませんが、これは確かにあなたが正しい方向に始めるのに役立つはずです。
それらの仮定のいくつかは次のとおりです。
- 関数に指定された名前に句読点はありません(たとえば、ピリオド付きのJr.)。
- 姓名が必要ですが、タイトル、ミドルネーム、サフィックスはオプションです。
- 質問で述べたように、結合演算子はandと&だけです。
- 名前はこの形式です{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 == "&";
}
}