好的,这里是一个我认为能为你做的工作。你当然可以做一些修改,因为我根据你的问题做了一些假设,但是这肯定会让你开始朝正确的方向发展。
其中一些假设如下:
- 有没有标点符号在提供给功能(例如与小的期间)的名称。
- 您必须有姓和名,但标题,中间名和后缀是可选的。
- 的只有加入运营商和和&就像在问题说明。
- 该名称的格式为{titles} {first name} {middle name} {last name} {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 == "&";
}
}
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ –
我投 “使用不同的领域”。 –
真棒链接@AustinSalonen –