2013-01-20 28 views
1

我正在寻找一些指导,说明如何在iOS中检查有效邮寄地址的粘贴板。iOS - 检查有效邮寄地址的粘贴板

如果有人贴

1234 Apple Street 
New York, NY 10011 

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

例如

Hey guys meet me at 1234 Apple Street New York, NY 10011 See you there! 

仍将解析正确的地址,城市,州和邮编。

任何帮助将不胜感激!

-Ways

回答

3

我是SmartyStreets的开发人员。我们对街道地址很疯狂,街道地址让我疯狂(,尤其是解析它们)。这是一条双向的街道。 (我是不是与街道双关语做了什么?)

首先,让我们来谈谈其中的地址是全部由自己的情况,因为这是比较容易,尽管还很难...

请参考this other question and answer关于非常相同事情。我也强烈建议您在问题和答案中都遵循相关问题的链接。解析地址是一堆蠕虫,但这不是不可能的。这只是真的很难做到可靠。

请注意在该问题的答案中可以出现多少个不同格式的有效地址。您有什么保证,用户将在中输入任何?这只是少数。还有其他人。考虑军队,邮政信箱,农村路线以及其他不符合典型格式的“特殊”地址。那些有两个或三个字的城市名称的地址呢?那些使用像100 N 500 E这样的网格系统的地址,或者套房,公寓,地板等辅助数字呢?带“1/2”,连字符(作为必填标点符号)的地址如何?地址缺少邮政编码或城市/州?

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

如果所有的地址,甚至大部分(这是不是这样),排在形式像你上面提出的,作为一个例子:

[主号码] [街道名称] [Any of these street suffixes]

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

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

您可以尝试编写一个正则表达式,如this guythat guy,但只有在地址是常规语言时才有效。他们不是经常的,regular expressions are not the answer

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

很显然,因为我在SmartyStreets工作,我倾向于建议您在那里开始搜索。您可以在主页上尝试一些自由表格地址(只需填写“街道”字段)。 But be aware of a few things that will probably always be an issue. LiveAddress API将在大多数时间为您解析街道地址。逛逛,但这应该给你一个想法。

现在你的第二个问题:从一串文本中提取街道地址。这在S.O.的其他地方已经被广泛报道。和interwebs,所以我不会涉及到很多细节。基本上,要可靠地做到这一点,您可能需要一些自然语言处理和人机交互来确认或纠正最佳猜测。

永远不要假设有关非标准化的解决了这些东西:

  • 开始与多家
  • 与多家结束
  • 两个数字之间
  • 一切都是一个地址
  • 拥有邮编
  • 地址不超过2个号码
  • 无歧义
  • 它存在
  • 一个街道后缀将始终存在
  • 它拼写正确
  • ...等。

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

祝你好运!

+0

哇...你是如此的令人难以置信的正确所有的吧!我很高兴这不是我在iOS中错过的东西。我想我必须把它放在backburner上,才能真正成为添加到我的应用程序中的一个很好的功能。再次感谢您的详细解释,当我有其他一切完成时,我会回顾SmartyStreets和其他公司,看看是否有什么兼容。再次非常感谢你让我疯狂! – Wes

+0

我不想*为你的应用增加一个漂亮的功能而让你望而却步 - 它会很棒!只要确保用户确认你的软件所做的任何猜测。我应该做出更清晰的底线。这些技巧希望能够引导您编写能够更好地猜测的软件。 – Matt

+1

是的,我打算这样做,它不会自动提交,但尽量填写邮政编码,国家等。 – Wes

3

我也在SmartyStreets工作,由于我不是开发人员,我不受任何限制,比如“无法完成”或“没有办法可靠地执行”。事实上,我提出的想法可能并不总是可能的,但是,我是一个解决问题的人,一个解决方案发现者,而这个特殊的问题绝对有一个解决方案。

您将需要以下内容:一小段正则表达式,对脚本语言(python,php,任何您喜欢的知识)的了解以及对地址验证工具的访问权限(这是必需的,以便您知道何时才能正确使用) 。

所以,让我们开始与例句:

嘿,伙计们见我在1234苹果街纽约,NY 10011见!

我们可以肯定,每个地址都有一个开始和结束。 (你可以把它带到银行!)

所以,如果你运行一个正则表达式来寻找字符串内地址的开始,你可以在地址开始之前消除所有的东西。这里有一个正则表达式,将做到这一点:

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

这会给你回如下:

1234苹果街纽约,NY 10011见!

现在,你已经到了一半,但你需要循环剩余的字符串。另一个可以肯定的假设是,一个地址永远不会超过328个字符(我填写了这个数字,但是你得到了这张图片,一个地址也必须有一个结尾,你可以通过确定一个地址来缩短字符串最大可接受的USPS地址长度。)

您将循环访问地址字符串,直到获得有效地址。要做到这一点,从头开始,每增加一个排列,向右移动一个词。这是地址验证服务派上用场的地方,因为您不知道地址结束的位置,这就是您需要知道的。因此,您从字符串中生成的每个排列(请记住,您从左侧开始)将被发送用于验证。由于没有有效的地址可以少于两个单词,因此您将从此处开始。以下是范例地址的排列以及验证结果(我通过在地址搜索框的地址栏中输入它smartystreets.com尝试每一个地址:

1234苹果==>失败

1234苹果街==>失败

1234苹果Street纽约==>失败

1234苹果街纽约==>失败

1234苹果街纽约==>宾果,有效地址匹配,无需保留阿婷。

现在,显然这不是一个有效的地址,但你可以用一个真实的地址尝试相同的东西,你会得到相同的结果。显然,这不是从字符串中提取有效地址的最复杂的方法,但它确实可行。而且,由于SmartyStreets允许您为每个查询发送多达100个地址,因此您可以将地址串排列最多99次,并将结果恢复到300ms以下。这不适用于每个地址,因为您一定会发现,但无论地址在文本字符串中的模糊程度如何,它都可以轻松处理大多数地址。

所以,我们从这个开始嘿,我们在纽约纽约10029 Apple Street 1234见面10011在这儿见!并且在不到半秒的时间内想出了这个1234 Apple Street New York,NY 10011-1000

很酷很棒吧?它甚至听起来非常容易来自非程序员。


让我们尝试将其与真实地址:

嘿,伙计们见我在4219乔恩年轻佛罗里达州的奥兰多32839见!

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

4219乔恩年轻佛罗里达州的奥兰多32839见!

置换,重复,验证:

4219乔恩==>失败

4219乔恩年轻==>失败

4219乔恩年轻奥兰多==>失败

4219乔恩年轻orlando fl ==>宾果,有效的地址匹配。

Address entry field Resulting address data

+2

你SmartyStreets球员真的知道你在说什么!我可以完全尝试在未来沿着这些路线做些事情。幸运的是,我还使用API​​(例如Google Places和Yelp)帮助查找企业地址,以帮助指导用户更正地址。只有不是企业的地址才是真正测试的地址。再次感谢这些信息,因为这将有助于将来解析数据。 – Wes