C#正则表达式拆分街道地址 - 南非

时间:2012-07-25 14:11:27

标签: c# regex

  

可能重复:
  Regular expression for parsing mailing addresses

我需要拆分一个有两种形式之一的街道地址。

12B Main Road
Main Road 12B

(所有部分都是可选的)

我需要分为街道名称(主要),街道类型(道路,已经有可能的街道类型列表),街道号码(12)和街道号码后缀(B)。

有什么建议吗?

将在C#中执行此操作。

2 个答案:

答案 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的操作。无论如何,您的要求很浅,甚至指向不安全的解决方案。