Saya sering melihat pertanyaan ini ketika saya bekerja di perusahaan verifikasi alamat. Saya memposting jawaban di sini untuk membuatnya lebih mudah diakses oleh programmer yang mencari-cari dengan pertanyaan yang sama. Perusahaan tempat saya memproses miliaran alamat, dan kami belajar banyak dalam prosesnya.
Pertama, kita perlu memahami beberapa hal tentang alamat.
Ini berarti bahwa ekspresi reguler keluar. Saya telah melihat semuanya, dari ekspresi reguler sederhana yang cocok dengan alamat dalam format yang sangat spesifik, hingga ini:
/ \ 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}) (pengadilan | ct | jalan | st | drive | dr | lane | ln | road | rd | blvd) ([\ s |, |. |;] + (? [[a-zA-Z | \ s +] {1,30}) {1,2}) ([ \ s |, |.] +)? \ b (AK | AL | AR | AZ | CA | CT | DC | DE | FL | GA | GU | HI | IA | ID | IL | IN | KS | KY | KY | LA | MA | MD | ME | MI | MN | MO | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | ATAU | PA | RI | SC | SD | TN | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s |, |.] + (? S + \ d {5})? ([\ S |, |.] +) / i
... untuk ini di mana 900+ file kelas garis menghasilkan ekspresi reguler supermasif dengan cepat untuk mencocokkan lebih banyak lagi. Saya tidak merekomendasikan ini (misalnya, ini biola dari regex di atas, yang membuat banyak kesalahan ). Tidak ada formula ajaib yang mudah untuk membuatnya bekerja. Dalam teori dan oleh teori, itu tidak mungkin untuk mencocokkan alamat dengan ekspresi reguler.
USPS Publikasi 28 mendokumentasikan banyak format alamat yang mungkin, dengan semua kata kunci dan variasinya. Yang terburuk dari semua, alamat seringkali ambigu. Kata-kata dapat berarti lebih dari satu hal ("St." dapat "Saint" atau "Street") dan ada kata-kata yang saya yakin mereka ciptakan. (Siapa yang tahu bahwa "Stravenue" adalah sufiks jalanan?)
Anda memerlukan beberapa kode yang benar-benar memahami alamat, dan jika kode itu memang ada, itu adalah rahasia dagang. Tapi Anda mungkin bisa menggulung sendiri jika Anda benar-benar menyukainya.
Alamat datang dalam bentuk dan ukuran yang tidak terduga
Berikut adalah beberapa alamat yang dibuat-buat (tapi lengkap):
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Bahkan ini mungkin valid:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Jelas, ini tidak standar. Tanda baca dan jeda baris tidak dijamin. Inilah yang terjadi:
Nomor 1 selesai karena berisi alamat jalan dan kota dan negara bagian. Dengan informasi itu, cukup mengidentifikasi alamat, dan itu dapat dianggap "terkirim" (dengan beberapa standardisasi).
Angka 2 selesai karena juga berisi alamat jalan (dengan nomor sekunder / unit) dan kode ZIP 5 digit, yang cukup untuk mengidentifikasi alamat.
Nomor 3 adalah format kotak pos lengkap, karena berisi kode ZIP.
Nomor 4 juga lengkap karena kode ZIP unik , artinya entitas swasta atau perusahaan telah membeli ruang alamat itu. Kode ZIP unik adalah untuk ruang pengiriman volume tinggi atau terkonsentrasi. Apa pun yang ditujukan ke kode ZIP 12345 pergi ke General Electric di Schenectady, NY. Contoh ini tidak akan menjangkau siapa pun secara khusus, tetapi USPS masih dapat mengirimkannya.
Angka 5 juga lengkap, percaya atau tidak. Dengan hanya angka-angka itu, alamat lengkap dapat ditemukan ketika diuraikan terhadap basis data semua alamat yang memungkinkan. Mengisi directionals yang hilang, designator sekunder, dan kode ZIP + 4 adalah sepele ketika Anda melihat setiap angka sebagai komponen. Begini tampilannya, sepenuhnya diperluas dan terstandarisasi:
205 N 1105 W Apt 14
Beverly Hills CA 90210-5221
Data alamat bukan milik Anda
Di sebagian besar negara yang menyediakan data alamat resmi untuk vendor berlisensi, data alamat itu sendiri milik badan pengatur. Di AS, USPS memiliki alamat. Hal yang sama berlaku untuk Canada Post, Royal Mail, dan lainnya, meskipun masing-masing negara memberlakukan atau mendefinisikan kepemilikan sedikit berbeda. Mengetahui hal ini penting, karena biasanya melarang rekayasa ulang database alamat. Anda harus berhati-hati cara mendapatkan, menyimpan, dan menggunakan data.
Google Maps adalah tujuan umum untuk perbaikan alamat cepat, tetapi KL agak mahal; misalnya, Anda tidak dapat menggunakan data atau API mereka tanpa menunjukkan Google Map, dan hanya untuk tujuan non-komersial (kecuali Anda membayar), dan Anda tidak dapat menyimpan data (kecuali untuk caching sementara). Masuk akal. Data Google adalah beberapa yang terbaik di dunia. Namun, Google Maps tidak memverifikasi alamat. Jika alamat tidak ada, masih akan menunjukkan di mana alamat akan menjadi jika memang ada (mencobanya di jalan Anda sendiri, menggunakan nomor rumah yang Anda tahu tidak ada). Terkadang ini berguna, tetapi perlu diperhatikan.
Kebijakan penggunaan Nominatim sama-sama membatasi, terutama untuk volume tinggi dan penggunaan komersial, dan data sebagian besar diambil dari sumber-sumber gratis, sehingga tidak dipelihara dengan baik (seperti sifat proyek terbuka) - namun, ini mungkin masih sesuai kebutuhanmu. Itu didukung oleh komunitas yang hebat.
USPS sendiri memiliki API, tetapi turun banyak dan tidak disertai jaminan atau dukungan. Mungkin juga sulit digunakan. Beberapa orang menggunakannya dengan hemat tanpa masalah. Tetapi mudah untuk dilewatkan bahwa USPS mengharuskan Anda menggunakan API mereka hanya untuk mengonfirmasi alamat untuk dikirimkan melalui mereka.
Orang berharap alamat menjadi sulit
Sayangnya, kami mengkondisikan masyarakat kami untuk mengharapkan alamat menjadi rumit. Ada lusinan artikel UX yang bagus di seluruh Internet tentang hal ini, tetapi faktanya, jika Anda memiliki formulir alamat dengan bidang individual, itulah yang diharapkan pengguna, meskipun itu membuat lebih sulit untuk alamat tepi-kasus yang tidak sesuai dengan format formulir mengharapkan, atau mungkin formulir memerlukan bidang yang seharusnya tidak. Atau pengguna tidak tahu di mana harus meletakkan bagian tertentu dari alamat mereka.
Saya bisa terus-menerus tentang UX buruk dari formulir checkout hari ini, tetapi sebagai gantinya saya hanya akan mengatakan bahwa menggabungkan alamat ke dalam satu bidang akan menjadi perubahan yang disambut baik - orang akan dapat mengetikkan alamat mereka sesuai keinginan mereka , daripada mencoba mencari tahu bentuk panjang Anda. Namun, perubahan ini akan tidak terduga dan pengguna mungkin merasa sedikit menggelegar pada awalnya. Sadarilah itu.
Bagian dari rasa sakit ini dapat dikurangi dengan menempatkan bidang negara di depan, di depan alamat. Ketika mereka mengisi bidang negara terlebih dahulu, Anda tahu cara membuat formulir Anda muncul. Mungkin Anda memiliki cara yang baik untuk menangani alamat US bidang tunggal, jadi jika mereka memilih Amerika Serikat, Anda bisa mengurangi formulir Anda menjadi satu bidang, jika tidak, tunjukkan bidang komponen. Hanya hal-hal untuk dipikirkan!
Sekarang kita tahu mengapa itu sulit; apa yang bisa kamu lakukan?
USPS melisensikan vendor melalui proses yang disebut Sertifikasi CASS ™ untuk memberikan alamat terverifikasi kepada pelanggan. Vendor ini memiliki akses ke basis data USPS, diperbarui setiap bulan. Perangkat lunak mereka harus sesuai dengan standar ketat untuk disertifikasi, dan mereka tidak sering memerlukan persetujuan untuk persyaratan pembatasan seperti yang dibahas di atas.
Ada banyak perusahaan CASS-Certified yang dapat memproses daftar atau memiliki API: Data Melissa, Experian QAS, dan SmartyStreets.
(Karena mendapatkan kritik untuk "iklan", saya telah memotong jawaban saya pada titik ini. Terserah Anda untuk menemukan solusi yang cocok untuk Anda.)
Kebenaran: Sungguh, kawan, saya tidak bekerja di perusahaan mana pun. Itu bukan iklan.