住所確認会社で働いていたとき、この質問をよく見かけました。同じ質問で検索しているプログラマーがアクセスしやすくするために、ここに回答を投稿しています。私がいた会社は数十億のアドレスを処理し、その過程で多くのことを学びました。
まず、アドレスについていくつか理解する必要があります。
これは、正規表現がアウトであることを意味します。非常に特殊な形式のアドレスに一致する単純な正規表現から、次のようにすべてを見てきました。
/\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})(裁判所|ct|通り|st|ドライブ|dr|車線|ln|道路|rd|通り)([\s|,|.|;]+)?(([a-zA-Z|\s+]{1,30}){1,2})([ \s|,|.]+)?\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|GU|HI|IA|ID|IL|IN|KS|KY |LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN |TX|UT|VA|VI|VT|WA|WI|WV|WY)([\s|,|.]+)?(\s+\d{5})?([\s|,|.] +)/i
...これまで、900以上の行クラスのファイルがその場で超大規模な正規表現を生成して、さらに一致させます。私はこれらをお勧めしません (例えば、これは上記の正規表現のフィドルであり、多くの間違いを犯します)。これを機能させるための簡単な魔法の公式はありません。理論的にも理論的にも、アドレスを正規表現で照合することは不可能です。
USPS Publication 28には、考えられる住所の多くの形式と、そのすべてのキーワードとバリエーションが記載されています。さらに悪いことに、アドレスがあいまいであることがよくあります。言葉には複数の意味があり ("St" は "Saint" または "Street" の場合もあります)、彼らが発明したと確信している言葉もあります。(「Stravenue」が通りの接尾辞であることを誰が知っていましたか?)
住所を本当に理解するコードが必要です。そのコードが存在する場合、それは企業秘密です。しかし、あなたが本当にそれに興味があるなら、あなたはおそらくあなた自身を転がすことができます.
住所は予想外の形と大きさになる
ここにいくつかの不自然な (しかし完全な) アドレスがあります:
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
これらでさえ有効である可能性があります:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
明らかに、これらは標準化されていません。句読点と改行は保証されません。何が起こっているかは次のとおりです。
番号 1は番地と市と州が含まれているため、完全です。その情報があれば、住所を特定するのに十分であり、「配送可能」と見なすことができます (ある程度の標準化が必要です)。
番号 2は、番地 (二次/ユニット番号付き) と住所を識別するのに十分な 5 桁の郵便番号が含まれているため、完全です。
番号 3は、郵便番号が含まれているため、完全な私書箱形式です。
番号 4も完了です。これは、郵便番号が一意であるためです。これは、個人または企業がそのアドレス空間を購入したことを意味します。固有の郵便番号は、大量または集中した配送スペース用です。郵便番号 12345 に宛てられたものはすべて、ニューヨーク州スケネクタディにある General Electric に送られます。この例は特に誰にも届きませんが、USPS は配達します。
信じられないかもしれませんが、 5 番も完成しています。これらの数字だけを使用して、考えられるすべての住所のデータベースに対して解析すると、完全な住所を発見できます。欠落している方向、二次指定子、および ZIP+4 コードを入力することは、各番号を構成要素として見ると簡単です。完全に拡張され、標準化されたものは次のようになります。
205 N 1105 W Apt 14
ビバリーヒルズ CA 90210-5221
住所データは自分のものではありません
正式な住所データを認可されたベンダーに提供しているほとんどの国では、住所データ自体は管理機関に属しています。米国では、USPS が住所を所有しています。同じことが Canada Post、Royal Mail などにも当てはまりますが、国によって所有権の強制または定義が少し異なります。通常、アドレス データベースのリバース エンジニアリングを禁止するため、これを知っておくことは重要です。データの取得、保存、使用方法には注意が必要です。
Google マップは、住所をすばやく修正するための一般的な手段ですが、TOSはかなり厳しすぎます。たとえば、Google マップを表示せずにデータや API を使用することはできず、非営利目的でのみ (料金を支払わない限り)、データを保存することもできません (一時的なキャッシュを除く)。理にかなっています。Google のデータは、世界でも最高のものです。ただし、Google マップは住所を確認しません。住所が存在しない場合でも、存在する場合の住所が表示されます (自分の通りで試してみてください。存在しないとわかっている番地を使用してください)。これは便利な場合もありますが、注意してください。
Nominatim の使用ポリシーも同様に制限的であり、特に大量の商用利用の場合は特に制限があり、データはほとんどが無料のソースから取得されているため、適切に維持されていません (オープン プロジェクトの性質など)。ただし、これはまだニーズに合っている場合があります。素晴らしいコミュニティがそれをサポートしています。
USPS 自体には API がありますが、頻繁にダウンし、保証もサポートもありません。また、使いにくい場合もあります。何の問題もなく控えめに使っている人もいます。しかし、USPS では、配送先の住所を確認するためだけに API を使用する必要があることを見逃しがちです。
人々は住所が難しいことを期待しています
残念ながら、住所が複雑であることを期待するように社会を慣らしてきました。これに関する優れた UX 記事がインターネット上に数多くあります。それでも、実際には、個々のフィールドを持つ住所フォームがある場合、それがユーザーが期待するものですが、フォームが期待する形式に適合しないエッジケースの住所の場合は難しくなります。すべきではないフィールド。または、ユーザーがアドレスの特定の部分をどこに入力すればよいかわかりません。
最近のチェックアウト フォームの UX の悪さについては延々と言い続けることができますが、代わりに、住所を 1 つのフィールドにまとめることは歓迎すべき変更であると言えます。 、長いフォームを理解しようとするのではなく。ただし、この変更は予想外のものであり、ユーザーは最初は少し戸惑うかもしれません。それを知っておいてください。
この問題の一部は、国フィールドをアドレスの前に置くことで軽減できます。最初に国のフィールドに入力すると、フォームを表示する方法がわかります。おそらく、単一フィールドの米国の住所を処理する良い方法があるので、彼らが米国を選択した場合は、フォームを単一のフィールドに減らし、それ以外の場合はコンポーネント フィールドを表示できます。考える事ばかり!
なぜそれが難しいのかがわかりました。あなたはそれについて何ができますか?
USPS は、CASS™ 認定と呼ばれるプロセスを通じてベンダーにライセンスを付与し、確認済みの住所を顧客に提供します。これらのベンダーは、毎月更新される USPS データベースにアクセスできます。彼らのソフトウェアは認定を受けるために厳格な基準に準拠している必要があり、多くの場合、上記のような制限条件への同意は必要ありません。
多くの CASS 認定企業は、リストを処理したり、API を使用したりできます: Melissa Data、Experian QAS、SmartyStreets などです。
(「広告」に対する非難が殺到したため、この時点で回答を切り捨てました。自分に合った解決策を見つけるのはあなた次第です。)
真実:本当に、皆さん、私はこれらの会社のいずれにも勤務していません。それは広告ではありません。