我们主要在美国开展业务,并试图通过将所有地址字段组合到单个文本区域来改善用户体验。但是有一些问题:
显然,这是一个常见的问题:
有没有办法将地址与周围的文本隔离开来,并将其分成几块?有没有一个正则表达式来解析地址?
发布于 2018-04-03 08:15:10
当我在地址验证公司工作时,我看到了很多这个问题。
首先,我们需要了解一些有关地址的内容。
这意味着正则表达式不存在。我已经看到了这一切,从简单的正则表达式匹配非常特定格式的地址到这个:
/\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
需要一些真正了解地址的代码,如果代码确实存在,是一个商业秘密。
以下是一些人为的(但完整的)地址:
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
即使这些可能是有效的:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
显然,这些都不是标准化的。标点符号和换行符不保证。
在向授权供应商提供官方地址数据的大多数国家,地址数据本身属于管理机构。在美国,USPS拥有这些地址。加拿大邮政,皇家邮政和其他国家也是如此,尽管每个国家都以不同的方式强制或定义所有权。这一点很重要,因为它通常禁止对地址数据库进行反向工程。必须小心如何获取,存储和使用数据。
谷歌地图是快速修复地址的常用工具,但TOS相当令人望而却步; 例如,不能在不显示Google Map的情况下使用他们的数据或API,并且仅用于非商业目的(除非支付费用),并且不能存储数据(临时缓存除外)。Google的数据是世界上最好的。然而,谷歌地图并没有验证地址。如果地址不存在,它仍然会显示所在地址
Nominatim的使用政策也同样受到限制,特别是对于大量使用和商业使用而言,数据大部分来自免费来源,因此不能很好地维护(这是开放项目的性质) - 但是,这可能仍然适用需求。
美国邮政本身有一个API,没有保证也没有支持。它可能也很难使用。有些人使用它没有问题。但很容易错过USPS要求仅使用API来确认通过它们发送的地址。
我们限制了我们的社会,地址变得复杂。整个互联网上有许多关于这方面的优秀用户体验文章,但事实是,如果你有一个单独的字段的地址表单,这是用户期望的,尽管它使得难以处理不符合边缘情况的地址表单格式期望的格式,或者表单需要不应该的字段。或者用户不知道在哪里放置他们地址的某个部分。
USPS通过一个名为CASS™认证的流程授权供应商为客户提供经过验证的地址。这些供应商可以访问USPS数据库,每月更新一次。他们的软件必须符合严格的标准才能获得认证,而且他们通常不需要同意上述讨论的这些限制条款。
有许多经过CASS认证的公司可以处理列表或具有API:Melissa Data,Experian QAS和SmartyStreets等等。
发布于 2018-04-03 09:55:26
有许多街道地址解析器。一种拥有地名和街道名称数据库,另一种没有。
正则表达式街道地址解析器可以达到约95%的成功率,而不会有太多麻烦。然后开始打不寻常的情况。CPAN中的Perl,“Geo :: StreetAddress :: US”就是这么好的。有Python和Javascript的端口,都是开源的。我有一个改进的Python版本,通过处理更多的案例,成功率略有提高。然而,要获得最后3%的权利,需要数据库来帮助消除歧义。
具有3位邮政编码和美国州名和缩写的数据库是一大帮助。当解析器看到一致的邮政编码和州名时,它可以开始锁定格式。这对美国和英国来说效果很好。
正确的街道地址解析从结尾开始并向后工作。这就是USPS系统如何做到的。最后,地址最不明确,国名,城市名称和邮政编码相对容易识别。街道名称通常可以被隔离。
https://stackoverflow.com/questions/-100003251
复制相似问题