【问题标题】:C# regex to split street address - South Africa [duplicate]C#正则表达式拆分街道地址-南非[重复]
【发布时间】:2017-04-06 22:16:28
【问题描述】:

可能重复:
Regular expression for parsing mailing addresses

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

12B 主干道 主干道 12B

(所有部分都是可选的)

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

有什么建议吗?

将在 C# 中执行此操作。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 这是针对哪些国家/地区的? “所有部分都是可选的”:如果您指定了这些部分会有所帮助(仅仅因为对您来说显而易见并不意味着它是显而易见的)。
  • 这些部分是街道名称(例如 Main)、街道编号(例如 12)、街道编号后缀(例如 B)和街道类型(例如 Road)。这代表的国家是南非,好像没有官方格式。

标签: c# regex


【解决方案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 获取有关如何修改它的信息。

【讨论】:

    【解决方案2】:

    你应该这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多