1

我正在寻找一些关于如何在 iOS 中检查粘贴板以获取有效邮寄地址的指导。

如果有人贴

1234 Apple Street
New York, NY 10011

它解析字符串的每个部分以填写地址、城市、州和邮编。它可以是任何地址,如果它可以在更长的字符串中找到,那将是理想的。

例如

Meet me at 1234 Apple Street New York, NY 10011 See you there!

仍然会解析正确的地址、城市、州和邮编。

任何帮助将非常感激!

-韦斯

4

2 回答 2

3

我是 SmartyStreets 的一名开发人员。我们对街道地址有点疯狂,街道地址让我发疯(尤其是解析它们)。这是一条双向的街道。(我完成了街头双关语吗?)

首先,让我们谈谈地址本身的情况,因为这更容易,尽管仍然很困难......

请参考this other question and answer about the very same thing。我也强烈建议您关注问题和答案中相关问题的链接。解析地址是一罐蠕虫,但这并非不可能。可靠地做到这一点真的很难。

请注意该问题的答案中可以出现多少种不同格式的有效地址。您有什么保证用户会在其中任何一种格式中键入它?而这只是少数。还有其他的。考虑军事、邮政信箱、乡村路线和其他不符合典型格式的“特殊”地址。有两个或三个单词城市名称的地址呢?使用网格系统(如 100 N 500 E)或次要号码(如套房、公寓、楼层等)的地址呢?带有“1/2”、连字符(作为必需的标点符号)等的地址呢?地址缺少邮政编码或城市/州?

所有这些以及更多可能都是有效的。这仅适用于美国地址。

如果您的所有地址,甚至大多数地址(不是这种情况)都以您上面建议的形式出现,例如:

[主要号码] [街道名称] [任何这些街道后缀]

[城市名称,后跟逗号],[州缩写] [5位邮政编码]

那么这将非常容易。那不是很好吗?

您可以尝试编写一个像this guythat guy这样的正则表达式,但这只有在地址是正则语言时才有效。它们不是正则的,正则表达式也不是答案

有一些服务可以为您做到这一点,因为它们有一个主列表(种类),并且软件必须符合严格的认证标准。

显然,由于我在 SmartyStreets 工作,我倾向于建议您从那里开始寻找答案。您可以在主页上尝试一些自由格式的地址(只需填写“街道”字段)。但请注意一些可能永远是个问题的事情。大多数时候,LiveAddress API 将能够为您解析街道地址。货比三家,但这应该给你一个想法。

现在您的第二个问题:从文本字符串中提取街道地址。这已在 SO 和互联网的其他地方广泛介绍,因此我不会详细介绍。基本上,要可靠地做到这一点,您可能需要一些自然语言处理和人工交互来确认或纠正最佳猜测。

永远不要假设这些关于非标准化地址的事情:

  • 以数字开头
  • 以数字结尾
  • 两个数字之间的一切都是地址
  • 有邮政编码
  • 一个地址中不超过 2 个数字
  • 这是明确的
  • 它存在
  • 街道后缀将始终存在
  • 它拼写正确
  • ...ETC。

同样,请参阅有关此问题的其他一些链接帖子。你可以做出猜测,但如果你这样做,总是总是有人来确认猜测。(一些 Mac 应用程序会这样做。如果他们检测到一个地址,它会突出显示,您可以将该地址添加到您的联系人中。不幸的是,我看到了很多误报,它也错过了很多。)

祝你好运!

于 2013-01-21T03:15:12.313 回答
3

我也在 SmartyStreets 工作,由于我不是开发人员,因此我不受任何约束,例如“无法完成”或“无法可靠地完成”。事实上,我提出的想法甚至可能并不总是可能的,但是,我是一个解决问题的人,一个寻找解决方案的人,这个特定的问题绝对有解决方案。

您将需要以下内容:一点正则表达式、脚本语言知识(python、php,无论您喜欢什么)和访问地址验证工具(这是必需的,以便您知道什么时候做对了)。

那么,让我们从例句开始:

在 1234 Apple Street New York, NY 10011 见!

我们可以确定每个地址都有开始和结束。(你可以把它交给银行!)

因此,如果您运行一个正则表达式来查找字符串中地址的开头,您可以在地址开始之前消除所有内容。这是一个可以做到这一点的正则表达式:

(^(.*(?=p\.?o\.? box|h\.?c\.?r\.? |c\.?m\.?r\.?)|^[^0-9]+))

这将为您返回以下内容:

1234 Apple Street New York, NY 10011 见!

现在,您已经完成了一半,但您需要遍历剩余的字符串。您当然可以做出的另一个假设是,地址的长度永远不会超过 328 个字符(我编了这个数字,但您明白了。地址也必须有结尾,您可以通过确定最大可接受的 USPS 地址长度。)

您将遍历地址字符串,直到从中获得有效地址。为此,请从头开始,每增加一个排列,就向右移动一个单词。这就是地址验证服务派上用场的地方,因为您不知道地址在哪里结束,而这正是您需要知道的。因此,您从字符串生成的每个排列(请记住,您从左侧开始)将被发送以进行验证。由于任何有效地址都不能少于两个单词,因此您将从那里开始。以下是示例地址的排列以及验证结果(我正在尝试通过在 smartystreets.com 上地址搜索框的地址行中输入每个地址:

第1234章

苹果街 1234 号 ==> 失败

1234 Apple Street New ==> 失败

纽约苹果街 1234 号 ==> 失败

1234 Apple Street New York, NY ==> Bingo,有效地址匹配。无需继续迭代。

现在,显然这不是一个有效的地址,但你可以用一个真实的地址尝试同样的事情,你会得到相同的结果。显然,这不是从字符串中提取有效地址的最复杂的方法,但它确实有效。而且,由于 SmartyStreets 允许您每次查询最多发送 100 个地址,您可以将地址字符串排列多达 99 次,并在 300 毫秒内返回结果。正如您肯定会发现的那样,这不适用于每个地址,但它可以很容易地处理其中的大部分,无论地址在文本字符串中的模糊程度如何。

所以,我们开始在 1234 Apple Street New York, NY 10011 与我见面!并在不到半秒钟的时间内想出了这个1234 Apple Street New York, NY 10011-1000

很酷吧?来自非程序员的声音甚至听起来很容易。


让我们用一个真实的地址试试:

在 4219 jon young orlando fl 32839 与我见面!

应用正则表达式,你会得到:

4219 乔恩·杨奥兰多佛罗里达州 32839 见!

置换、迭代、验证:

第4219章 ==>失败

第4219章

第4219章

4219 jon young orlando fl ==> Bingo,有效地址匹配。

地址输入字段 生成的地址数据

于 2013-01-22T02:46:30.840 回答