我也在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 ==>賓果,有效的地址匹配。
哇...你是如此的令人難以置信的正確所有的吧!我很高興這不是我在iOS中錯過的東西。我想我必須把它放在backburner上,才能真正成爲添加到我的應用程序中的一個很好的功能。再次感謝您的詳細解釋,當我有其他一切完成時,我會回顧SmartyStreets和其他公司,看看是否有什麼兼容。再次非常感謝你讓我瘋狂! – Wes
我不想*爲你的應用增加一個漂亮的功能而讓你望而卻步 - 它會很棒!只要確保用戶確認你的軟件所做的任何猜測。我應該做出更清晰的底線。這些技巧希望能夠引導您編寫能夠更好地猜測的軟件。 – Matt
是的,我打算這樣做,它不會自動提交,但儘量填寫郵政編碼,國家等。 – Wes