Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将名称拆分为字段?_C#_Regex - Fatal编程技术网

C# 将名称拆分为字段?

C# 将名称拆分为字段?,c#,regex,C#,Regex,有没有一种神奇的正则表达式或C#中的方法可以为我实现这一点 有人在“全名”字段中键入字符串,我需要将其拆分为: 标题 名字 中间的 姓 后缀 但是用户可以输入“John Smith”,因此需要将John输入名字,将Smith输入姓氏。一个人可以键入John Smith先生(我有一个已知标题和后缀的列表),因此如果第一个字符串是标题,它将进入标题字段 一个完美的例子是: 小约翰·坎贝尔·史密斯先生 但是,他们可以: 约翰夫妇和玛丽·史密斯夫妇 因此头衔是Mr和Mrs,名字是John和Mary,姓氏

有没有一种神奇的正则表达式或C#中的方法可以为我实现这一点

有人在“全名”字段中键入字符串,我需要将其拆分为: 标题 名字 中间的 姓 后缀

但是用户可以输入“John Smith”,因此需要将John输入名字,将Smith输入姓氏。一个人可以键入John Smith先生(我有一个已知标题和后缀的列表),因此如果第一个字符串是标题,它将进入标题字段

一个完美的例子是:

小约翰·坎贝尔·史密斯先生

但是,他们可以:

约翰夫妇和玛丽·史密斯夫妇

因此头衔是Mr和Mrs,名字是John和Mary,姓氏是Smith(他们可以用“and”或“&”作为木匠)


我觉得这对正则表达式来说太复杂了,但我希望有人能有个想法?

好吧,我想这是一个可以帮你完成这项工作的程序。当然,你可能需要做一些修改,因为我根据你的问题做了一些假设,但这肯定会让你朝着正确的方向开始

其中一些假设如下:

  • 函数名中没有标点符号(例如带句号的Jr)
  • 必须有名和姓,但标题、中间名和后缀是可选的
  • 如问题中所述,联接运算符是以及&
  • 名称的格式为{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 == "&";
        }
    }
    
    类程序
    {
    静态列表_titles=新列表{“Mr”、“Mrs”、“Miss”};
    静态列表_后缀=新列表{“Jr”,“Sr”};
    静态void Main(字符串[]参数)
    {
    var name组合=新列表
    {
    “约翰夫妇和玛丽·苏·史密斯先生”,
    “约翰夫妇和玛丽·史密斯先生”,
    “约翰夫妇和玛丽·苏·史密斯”,
    “约翰夫妇和玛丽·史密斯”,
    “小约翰·史密斯先生和夫人”,
    “约翰·史密斯先生和夫人”,
    “约翰·史密斯”,
    “约翰和玛丽·史密斯”,
    “小约翰和玛丽·史密斯”,
    “小约翰·坎贝尔·史密斯先生”,
    “约翰·史密斯先生”,
    “小约翰·史密斯先生”,
    };
    foreach(名称组合中的变量名称)
    {
    Console.WriteLine(名称);
    var细分=InterperetName(名称);
    WriteLine(“Title:{0}”,string.Join(“,”,breakdown.Item1));
    WriteLine(“名字:{0}”,string.Join(“,”,breakdown.Item2));
    WriteLine(“中间名:{0}”,breakdown.Item3);
    WriteLine(“姓氏:{0}”,breakdown.Item4);
    WriteLine(“后缀:{0}”,breakdown.Item5);
    Console.WriteLine();
    }
    Console.ReadKey();
    }
    静态元组InterperetName(字符串名称)
    {
    var segments=name.Split(“.ToCharArray(),StringSplitOptions.RemoveEmptyEntries”);
    列表标题=新列表(),
    firstNames=新列表();
    字符串middleName=null,lastName=null,后缀=null;
    int段=0;
    对于(int i=0;i
    我赞成“使用单独的字段”。“Smith Jr”很可能是姓名和姓氏(有两个字母的姓氏),因此使用单独的字段来确保,就像@AlinMirceaCosma建议的那样,似乎更符合逻辑。我们将存储为单独的字段。问题是,客户端有一个现有的VB6应用程序,它按照我所描述的方式运行。。。并希望在新的应用程序中复制。只需将您的姓名存储为单个varchar/字符串即可。为什么要把它拆开呢?效果非常好。实际上是福罗