虽然我知道匹配街道地址永远不会是完美的,但我希望创建一些大部分时间都能接近的正则表达式。
我正在尝试突出显示一个地址。我在正则表达式上很糟糕,我试图接近但是有人可以帮我理解如何让它变得更好吗?
的字符串:
早上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
答案 0 :(得分:32)
美国地址不是常规语言,使用正则表达式无法匹配。它们在某些孤立的情况下很有帮助,但总的来说,它们会让你失望,特别是对于这样的输入。
我曾经在一家地址验证公司工作。在回答您的问题时,为了在一串文本中“突出显示地址”,我建议您尝试使用提取实用程序。有几个,我建议你环顾四周,但这里是 ours 使用你问题的输入---你可以看到,它找到了地址并验证了它:
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!')
}