3

可能重复:
用于解析邮寄地址的正则表达式

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

12B 主干道
主干道 12B

(所有部分都是可选的)

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

有什么建议吗?

将在 C# 中执行此操作。

4

2 回答 2

2

考虑到我不知道所有的细节(你怎么能期望道路被格式化),这个问题很难回答,但我会尽我所能。

对于您的 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获取有关如何修改它的信息。

于 2012-07-25T14:27:22.580 回答
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 采取措施。无论如何,您的要求很肤浅,甚至指向不安全的解决方案。

于 2012-07-25T14:31:37.173 回答