我需要拆分一个有两种形式之一的街道地址。
12B Main Road Main Road 12B
(所有部分都是可选的)
我需要分为街道名称(主要),街道类型(道路,已经有可能的街道类型列表),街道号码(12)和街道号码后缀(B)。
有什么建议吗?
将在C#中执行此操作。
答案 0 :(得分:1)
考虑到我不知道所有的细节(你怎么能期望道路被格式化),这个问题很难回答,但我会尽我所能。
对于您的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获取有关如何修改此信息的信息。
答案 1 :(得分:0)
你应该这样做:
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的操作。无论如何,您的要求很浅,甚至指向不安全的解决方案。