正则表达式街道地址匹配

IT技术 javascript regex match highlight street-address
2021-02-20 11:58:37

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

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

string:

上午 6 点 - 晚上 11 点,帕尔马索拉小学,西北第五大道 6806 号,布雷登顿,佛罗里达州 34209 来找靠近 dsfsd sa fsa fasdf asfsds 5001 西你妈妈不住在这里,我的 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/

4个回答

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

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

LiveAddress 提取示例

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

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

另一个验证想法是使用 Google 的地理编码 API 来确定他们是否拥有该地址的数据。
2021-04-20 11:58:37
这是 SmartyStreets 的答案还是广告?
2021-05-08 11:58:37
@Nick 这是一个答案。如果是广告,我就不会说我在那里工作。我也不会建议他考虑其他选择。这是广告的样子:stackoverflow.com/a/7463590/1048862
2021-05-10 11:58:37

我需要为地址做类似的事情

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

9801 NW 3 STREET APT 5, 种植园

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

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

街道名称系统:

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

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

这对我有用!

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