正则表达式街道地址匹配

时间:2012-02-22 15:14:47

标签: javascript regex match highlight street-address

虽然我知道匹配街道地址永远不会是完美的,但我希望创建一些大部分时间都能接近的正则表达式。

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

的字符串:

  

早上6点 - 11点,帕尔玛索拉小学,6806 Fifth Ave NW,Bradenton,FL 34209来到dsfsd sa fsa fasdf附近asfsds 5001 west你的妈妈不住在我的2005 ford游侠,

正则表达式1:

  

/ \ S +(\ d {2,5} \ S +)([A | P]?!米\ b)中(([A-ZA-Z | \ S +] {1,5}){1, ?2})([\ S | \,|。] +)(([A-ZA-Z | \ S +] {1,30}){1,4})(法院|克拉|街道| ST |驱动|博士|车道| LN |道路| 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 |肯塔基州| LA | MA | MD | ME | MI | MN | MO | MS | MT |数控| ND | NE | NH |新泽西州| NM | NV |纽约州| OH | OK |和| PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY)([\ S | \,|。] +)(\ S + \ d {5})(? [\ S | \,|。] +)/ I

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

正则表达式2:

  (?![A | P]米\ B)

/ \ B(\ d {2,5} \ S +)(NW | NE | SW | SE |北|南|西|东| N | E | S |?W)([\ S | \,|。] +)((?[A-ZA-Z | \ S +] {1,30}){1,4})(法院|克拉|街道| ST |驱动|博士|车道| LN |道路| RD | BLVD)/ I

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

4 个答案:

答案 0 :(得分:32)

美国地址不是常规语言,使用正则表达式无法匹配。它们在某些孤立的情况下很有帮助,但总的来说,它们会让你失望,特别是对于这样的输入。

我曾经在一家地址验证公司工作。在回答您的问题时,为了在一串文本中“突出显示地址”,我建议您尝试使用提取实用程序。有几个,我建议你环顾四周,但这里是 ours 使用你问题的输入---你可以看到,它找到了地址并验证了它:

LiveAddress extraction example

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

我赞扬你冒着尝试过的那些正则表达式!希望这很有用。

答案 1 :(得分:2)

我需要为类似

的地址做类似的事情
  

800 SE 20 AVENUE#603,DEERFIELD BEACH

     

9801 NW 3 STREET APT 5,PLANTATION

     

11909 GLENMORE DRIVE#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

答案 2 :(得分:0)

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

街道名称系统:

/\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

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

答案 3 :(得分:-1)

这对我有用!

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