【问题标题】:regex street address match正则表达式街道地址匹配
【发布时间】:2012-03-12 22:33:01
【问题描述】:

虽然我知道匹配街道地址永远不会是完美的,但我希望创建几个在大多数情况下都会接近的正则表达式语句。

我正在尝试突出显示一个地址。我对正则表达式很烂,我试图接近,但有人可以帮助我了解如何让它变得更好吗?

字符串:

早上 6 点 - 晚上 11 点,Palma Sola 小学,6806 Fifth Ave NW, Bradenton, FL 34209 快来看看 dsfsd sa fsa fasdf asfsds 5001 west 你妈妈不住在这里,我的 2005 福特游侠,

正则表达式 1:

/\s+(\d{2,5}\s+)(?![a|p]m\b)(([a-zA-Z|\s+]{1,5}){1, 2})?([\s|\,|.]+)?(([a-zA-Z|\s+]{1,30}){1,4})(court|ct|street|st| drive|dr|lane|ln|road|rd|blvd)([\s|\,|.|\;]+)?(([a-zA-Z|\s+]{1,30}){1 ,2})([\s|\,|.]+)?\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|GU|HI|IA|ID| IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA| RI|SC|SD|TN|TX|UT|VA|VI|VT|WA|WI|WV|WY)([\s|\,|.]+)?(\s+\d{5})?( [\s|\,|.]+)/i

(有时只有街道和城市,但没有州或邮政编码)

正则表达式 2:

/\b(\d{2,5}\s+)(?![a|p]m\b)(NW|NE|SW|SE|north|south|west|east|n|e| s|w)?([\s|\,|.]+)?(([a-zA-Z|\s+]{1,30}){1,4})(court|ct|street|st |drive|dr|lane|ln|road|rd|blvd)/i

摆弄它:http://jsfiddle.net/isuelt/rMC6P/11/

【问题讨论】:

  • 您没有说明您的最终目标,因此我们无法知道您想要什么或我们可以如何提供帮助。 “为了让它变得更好”是相当模糊的:)
  • 我的眼睛。我的眼睛。
  • 欢迎来到 Stack Overflow,@isuelt -- 已经有一段时间了,所以不要忘记点击复选标记接受最有帮助的答案。
  • 我发现这个也很有用:codeproject.com/Tips/989012/…

标签: javascript regex match highlight street-address


【解决方案1】:

美国地址不是正则语言,不能用正则表达式匹配。它们在一些孤立的情况下很有帮助,但一般来说,它们会让你失望,尤其是对于这样的输入。

我曾经在一家地址验证公司工作。为了回答您的问题,要在一串文本中“突出显示地址”,我建议您尝试使用提取实用程序。那里有一些,我建议您环顾四周,但这里是 ours 使用您问题的输入 --- 如您所见,它找到了地址并对其进行了验证: p>

API 端点返回 JSON,其中包含每个地址的开始和结束位置,以及关于每个地址的大量信息。 (请参见上图底部的 CSV 输出。)

我赞扬你勇敢地尝试了那些正则表达式!希望这会有所帮助。

【讨论】:

  • 另一个验证方法是使用 Google 的地理编码 API 来确定他们是否有该地址的数据。
  • 这是 SmartyStreets 的答案还是广告?
  • @Nick 这是一个答案。如果是广告,我不会说我在那里工作。我也不建议他考虑其他选择。这是广告的样子:stackoverflow.com/a/7463590/1048862
【解决方案2】:

这对我有用!

if(address.match(/^\s*\S+(?:\s+\S+){2}/)) {
   console.log('good address!')
}

【讨论】:

    【解决方案3】:

    马特是对的。正则表达式解析永远不会非常准确。如果你走这条危险的道路,你将不可避免地有合理数量的误报和漏报。但是,如果您对此感到满意,我实际上喜欢使用两种正则表达式的组合 - 一种用于基于街道命名的方案,一种用于城市网格方案:

    街道名称系统:

    /\b\d{1,6} +.{2,25}\b(avenue|ave|court|ct|street|st|drive|dr|lane|ln|road|rd|blvd|plaza|parkway|pkwy)[.,]?(.{0,25} +\b\d{5}\b)?/ig
    

    网格系统

    /(\b( +)?\d{1,6} +(north|east|south|west|n|e|s|w)[,.]?){2}(.{0,25} +\b\d{5}\b)?\b/ig
    

    另外请注意,如果地址没有州和邮政编码,您基本上可以忘记提取街道名称之后的任何文本。

    【讨论】:

      【解决方案4】:

      我需要对像

      这样的地址做类似的事情

      800 SE 20 AVENUE #603,迪尔菲尔德海滩

      9801 NW 3 STREET APT 5, 种植园

      11909 格伦莫尔大道 #4-1,珊瑚泉

      这是我使用的正则表达式

      \s*([0-9]*)\s((NW|SW|SE|NE|S|N|E|W))?(.*)((NW|SW|SE|NE|S|N|E|W))?((#|APT|BSMT|BLDG|DEPT|FL|FRNT|HNGR|KEY|LBBY|LOT|LOWR|OFC|PH|PIER|REAR|RM|SIDE|SLIP|SPC|STOP|STE|TRLR|UNIT|UPPR|\,)[^,]*)(\,)([\s\w]*)\n
      

      它为地址的每个部分返回单独的组(我不需要为我的案例解析状态名称)。 在这里试试 https://regex101.com/r/OsvOxn/3

      【讨论】:

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