2013-01-20 29 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