Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# Regex-使用第一个和最后一个中间点解析名称_C#_.net_Regex - Fatal编程技术网

C# Regex-使用第一个和最后一个中间点解析名称

C# Regex-使用第一个和最后一个中间点解析名称,c#,.net,regex,C#,.net,Regex,我正在尝试解析具有以下格式的名称(使用.Net) 上中段 不过,这里有一个技巧,第一和中间是可选的,因此: 如果文本为: 约翰逊 那么这就是我的姓 如果文本为: 玛丽约翰逊 然后假设这是第一个(玛丽)和最后一个(约翰逊) 如果文本为: 玛丽·约翰逊·雷·安妮 然后假设这是第一个(玛丽)、最后一个(约翰逊)和中间的(雷·安妮) 这就是我到目前为止所做的: ^(?<first>\s*\S+)\s*(?<last>(\S*\s*)*?)(?<middle>\S*\s

我正在尝试解析具有以下格式的名称(使用.Net)

上中段

不过,这里有一个技巧,第一和中间是可选的,因此:

如果文本为:

约翰逊

那么这就是我的姓

如果文本为: 玛丽约翰逊 然后假设这是第一个(玛丽)和最后一个(约翰逊)

如果文本为:

玛丽·约翰逊·雷·安妮

然后假设这是第一个(玛丽)、最后一个(约翰逊)和中间的(雷·安妮)

这就是我到目前为止所做的:

^(?<first>\s*\S+)\s*(?<last>(\S*\s*)*?)(?<middle>\S*\s*)$
^(?\s*\s+)\s*(?(\s*\s*)*?)(?\s*\s*))$
下面是部分解决方案和名称的链接:

^(?(?\w+)\s+(?\w+)\s*(?*)
^(?(?\w+)\s+(?\w+)\s*(?*)
^((?\w+)\s)?(?\w+)(\s)(?\w+)*$
这将使他们进入您想要的所有捕获组,但中间将有一个或多个捕获(如果没有,则第一个为空),这取决于此人有多少中间名,并且需要加入到您的代码中。

^((?\w+)\s)?(?\w+)(\s)(?\w+)*$

这将使他们进入您想要的所有捕获组,但中间将有一个或多个捕获(如果没有,则第一个为空),这取决于此人有多少中间名,并且需要加入到您的代码中。

对不起,太原始了,但为什么不呢

        private Tuple<string, string, string> Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;

            var arr = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 1)
            {
                return new Tuple<string, string, string>(null, null, arr[0]);
            }

            if (arr.Length == 2)
            {
                return new Tuple<string, string, string>(arr[0], null, arr[1]);
            }

            return new Tuple<string, string, string>(arr[0], String.Join(" ", arr.Skip(1).Take(arr.Length - 2)), arr[arr.Length - 1]);
        }
私有元组解析(字符串输入)
{
if(string.IsNullOrEmpty(输入))
返回null;
var arr=input.Split(“.ToCharArray(),StringSplitOptions.RemoveEmptyEntries”);
如果(arr.Length==1)
{
返回新元组(null,null,arr[0]);
}
如果(arr.Length==2)
{
返回新元组(arr[0],null,arr[1]);
}
返回新元组(arr[0],String.Join(“,arr.Skip(1).Take(arr.Length-2)),arr[arr.Length-1]);
}

很抱歉,我是原始主义者,但为什么不呢

        private Tuple<string, string, string> Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;

            var arr = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 1)
            {
                return new Tuple<string, string, string>(null, null, arr[0]);
            }

            if (arr.Length == 2)
            {
                return new Tuple<string, string, string>(arr[0], null, arr[1]);
            }

            return new Tuple<string, string, string>(arr[0], String.Join(" ", arr.Skip(1).Take(arr.Length - 2)), arr[arr.Length - 1]);
        }
私有元组解析(字符串输入)
{
if(string.IsNullOrEmpty(输入))
返回null;
var arr=input.Split(“.ToCharArray(),StringSplitOptions.RemoveEmptyEntries”);
如果(arr.Length==1)
{
返回新元组(null,null,arr[0]);
}
如果(arr.Length==2)
{
返回新元组(arr[0],null,arr[1]);
}
返回新元组(arr[0],String.Join(“,arr.Skip(1).Take(arr.Length-2)),arr[arr.Length-1]);
}

试试看。但在我看来,没有正则表达式,你可以更轻松地完成。用空格分割并分析各个部分。这更接近,似乎必须有一种方法告诉姓氏来吞食(贪婪),并使其他两个懒惰的基础上这一个。不过我同意,对于这种情况,这会更容易,但这次不行。对不起,忽略了中间是最后一个。看,试试看。但在我看来,没有正则表达式你可以做得更容易。用空格分割并分析各个部分。这更接近,似乎必须有一种方法告诉姓氏来吞食(贪婪),并使其他两个懒惰的基础上这一个。不过我同意,对于这种情况,这会更容易,但这次不行。对不起,忽略了中间是最后一个。请参阅。这是有道理的,但是有没有任何方法可以使用命名的捕获来实现这一点?这是一个可配置的正则表达式,依赖于命名的组。@PMil,实际上,我得到了一个启示。请查看我的更新。@ndn我打算发布几乎相同的内容,但将中间组设置为可选组并处理尾随空格,请查看-如果有relevance@SebastianProske,中间部分是可选的(
*
可以匹配0个字符)。只需发布我的最终正则表达式。稍微调整以允许前导空格和非字母数字字符:^\s*(?:(?\s+)\s+(?\s+)(?\s+)\s*(?*)有意义,但是否有任何方法可以使用命名的捕获来实现这一点?这是一个可配置的正则表达式,依赖于命名的组。@PMil,实际上,我得到了一个启示。请查看我的更新。@ndn我打算发布几乎相同的内容,但将中间组设置为可选组并处理尾随空格,请查看-如果有relevance@SebastianProske,中间部分是可选的(
*
可以匹配0个字符)。只需发布我的最终正则表达式。稍微调整以允许前导空格和非字母数字字符:^\s*(?:(?\s+)\s+)(?\s+)\s*(?*)
        private Tuple<string, string, string> Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;

            var arr = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 1)
            {
                return new Tuple<string, string, string>(null, null, arr[0]);
            }

            if (arr.Length == 2)
            {
                return new Tuple<string, string, string>(arr[0], null, arr[1]);
            }

            return new Tuple<string, string, string>(arr[0], String.Join(" ", arr.Skip(1).Take(arr.Length - 2)), arr[arr.Length - 1]);
        }