可能重复:
用于解析邮寄地址的正则表达式
我需要拆分具有两种形式之一的街道地址。
12B 主干道 主干道 12B
(所有部分都是可选的)
我需要拆分为街道名称(主要)、街道类型(道路,已经有可能的街道类型列表)、街道编号(12)和街道编号后缀(B)。
有什么建议吗?
将在 C# 中执行此操作。
可能重复:
用于解析邮寄地址的正则表达式
我需要拆分具有两种形式之一的街道地址。
12B 主干道 主干道 12B
(所有部分都是可选的)
我需要拆分为街道名称(主要)、街道类型(道路,已经有可能的街道类型列表)、街道编号(12)和街道编号后缀(B)。
有什么建议吗?
将在 C# 中执行此操作。
考虑到我不知道所有的细节(你怎么能期望道路被格式化),这个问题很难回答,但我会尽我所能。
对于您的 2 个具体示例,您可以拥有
@"([\d|A-Z]*) ([A-Z|a-z| ]*) ([A-Z|a-z]*)"
将与您的第一个答案的顺序相匹配
@"([A-Z|a-z| ]*) ([A-Z|a-z]*) ([\d|A-Z]*)"
将匹配您的第二个答案。
例子:
Regex regex = new Regex(@"([\d|A-Z]*) ([A-Z|a-z| ]*) ([A-Z|a-z]*)");
foreach (Group g in regex.Match("12B Main Road").Groups)
{
Console.WriteLine(g.Value);
}
该程序的输出如下所示
12B Main Road
12B
Main
Road
Press any key to continue . . .
使用Regex Cheat Sheet获取有关如何修改它的信息。
你应该这样做:
Match m1 = Regex.Match(input, @"^(?<number>\d+[A-Z]?)?((?<name>[a-zA-Z]+)\s)?(?<type>Road|Drive|AndSoOn)?$")
Match m2 = Regex.Match(input, @"^(?<name>[a-zA-Z]+)?\s(?<type>Road|Drive|AndSoOn)?(?<number>\d+[A-Z]?)?$");
然后检查 Success 属性并对 Regex.Groups 采取措施。无论如何,您的要求很肤浅,甚至指向不安全的解决方案。