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