【问题标题】:Match each address from the address number to the 'street type'将地址编号中的每个地址与“街道类型”匹配
【发布时间】:2011-07-01 00:13:36
【问题描述】:

我有一段文字包含以下地址:

  • 格林伍德街 900 号
  • 在大街 500 号街区
  • 在 670 W. Townline Ave.
  • 1234 River Avenue 之前
  • 位于主大街 1125 号。

我想将每个地址从地址编号匹配到“街道类型”(ave.、street、lane、road、rd.等)除了以单词开头的地址的。

所以在上面的地址中,语句会匹配:

格林伍德街 900 号 大街500号街区 670 W. Townline 大道。 1234河大道

并且不匹配:

主大街 1125 号

【问题讨论】:

  • 段落中是否有不属于地址的数字?
  • 这看起来像家庭作业。是吗?
  • 即使在应用下面的正则表达式之一之后,您仍需要确认它已正确解析。我在地址验证行业 (SmartyStreets) 工作,这是一项常见任务——因此,为了确保您拥有准确的数据,您需要根据 USPS 认可的地址对其进行测试。例如,查看 LiveAddress(它是免费的)。希望对您有所帮助。

标签: javascript regex


【解决方案1】:

据我所知,这种复杂的任务没有一个简单的正则表达式模式。要使一种模式可靠地工作,要涵盖的变量太多。我的第一个猜测是寻找“street”、“ave”等,但如果街道名称没有后缀(即 999 La Canada)怎么办?您可以查找“at”、“in”或“before”之间的任何短语,但如果其中一个短语不是地址怎么办?明白我的意思了吗?

我的建议是看一下 Perl 的 Lingua::EN::AddressParse。

【讨论】:

    【解决方案2】:

    这满足了您的要求:

    (?!^of\b)^.*?(\d+.*?(?:St\.|Street|Ave\.|Avenue))$
    

    看here on Regexr

    (?!^of\b)否定前瞻,行不以“of”开头

    ^ 匹配行的开头,使用m 修饰符!

    .*? 匹配所有非贪婪的东西

    (\d+.*? 找到第一个数字后,以( 开始第一个捕获组

    (?:St\.|Street|Ave\.|Avenue)) 非捕获组,因为?: 匹配| 之间的交替。最后一个) 用结果关闭捕获组。

    $匹配行尾,使用m修饰符!

    您的结果在第一个捕获组中。

    重要这适用于您给定的示例,地址可能不同,它不适用于所有类型的现有地址。

    【讨论】:

      【解决方案3】:

      什么时候

      s = "at 900 Greenwood St.\n\
      in 500 block of Main Street\n\
      at 670 W. Townline Ave.\n\
      before 1234 River Avenue\n\
      of 1125 Main Ave."
      

      正则表达式

      /(?:^|\s)(?:(?!of\b)[a-z]+)\s*(\d[\s\S]*?\b(?:ave\.|avenue|st\.|street|lane|road|rd\.))/gi
      

      这样使用

      var addresses = [];
      for (var match = [], re = /(?:^|\s)(?:(?!of\b)[a-z]+)\s*(\d[\s\S]*?\b(?:ave\.|avenue|st\.|street|lane|road|rd\.))/gi;
           match = re.exec(s);) {
        addresses.push(match[1]);
      }
      

      生产

      ["900 Greenwood St.","500 block of Main Street","670 W. Townline Ave.","1234 River Avenue"]
      

      【讨论】:

      • @Brock Adams, \w 匹配 [0-9] 使其接受部分数字。现在已修复。
      【解决方案4】:
      var addrs = create_array_of_possible_addresses();
      var matching_addrs = [];
      for (var i=0; i < addrs.length; i++) {
          if ( addrs[i].match(/^of/) continue;
          if ( addrs[i].match((/\d.*(?:St\.?|Street|Ave\.?|Avenue|Ln\.?|Rd\.?|Road))/ )
              matching_addrs.push( RegExp.$1 );
      }
      

      未经测试。

      【讨论】:

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