Ich habe diese Frage oft gesehen, als ich für eine Adressüberprüfungsfirma gearbeitet habe. Ich poste die Antwort hier, um sie Programmierern zugänglicher zu machen, die mit derselben Frage suchen. Die Firma, in der ich tätig war, hat Milliarden von Adressen verarbeitet, und wir haben dabei viel gelernt.
Zunächst müssen wir einige Dinge über Adressen verstehen.
Dies bedeutet, dass reguläre Ausdrücke nicht vorhanden sind. Ich habe alles gesehen, von einfachen regulären Ausdrücken, die Adressen in einem ganz bestimmten Format entsprechen, bis zu diesem:
/ \ 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}) (Gericht | ct | Straße | st | fahren | dr | Spur | ln | Straße | rd | blvd) ([\ 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
... auf diese , wo eine 900+ Line-Klasse - Datei auf der Fliege einen super regulären Ausdruck erzeugt noch mehr entsprechen. Ich empfehle diese nicht (zum Beispiel hier eine Geige der obigen Regex, die viele Fehler macht ). Es gibt keine einfache Zauberformel, um dies zum Laufen zu bringen. In der Theorie und von der Theorie ist es nicht möglich , Adressen mit einem regulären Ausdruck übereinstimmen.
Die USPS-Publikation 28 dokumentiert die vielen möglichen Adressformate mit all ihren Schlüsselwörtern und Variationen. Am schlimmsten ist, dass Adressen oft nicht eindeutig sind. Wörter können mehr als eine Sache bedeuten ("St" kann "Saint" oder "Street" sein) und es gibt Wörter, von denen ich mir ziemlich sicher bin, dass sie erfunden wurden. (Wer wusste, dass "Stravenue" ein Straßensuffix ist?)
Sie benötigen einen Code, der Adressen wirklich versteht, und wenn dieser Code vorhanden ist, ist er ein Geschäftsgeheimnis. Aber Sie könnten wahrscheinlich Ihre eigenen rollen, wenn Sie wirklich darauf stehen.
Adressen gibt es in unerwarteten Formen und Größen
Hier sind einige erfundene (aber vollständige) Adressen:
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Auch diese sind möglicherweise gültig:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Offensichtlich sind diese nicht standardisiert. Interpunktion und Zeilenumbrüche sind nicht garantiert. Folgendes ist los:
Nummer 1 ist vollständig, da sie eine Adresse sowie eine Stadt und ein Bundesland enthält. Mit diesen Informationen ist die Adresse ausreichend identifiziert und kann als "lieferbar" angesehen werden (mit einigen Standardisierungen).
Nummer 2 ist vollständig, da sie auch eine Straße (mit Sekundär- / Einheitennummer) und eine 5-stellige Postleitzahl enthält, die ausreicht, um eine Adresse zu identifizieren.
Nummer 3 ist ein vollständiges Postfachformat, da es eine Postleitzahl enthält.
Nummer 4 ist auch vollständig, da die Postleitzahl eindeutig ist , was bedeutet, dass eine private Einrichtung oder ein Unternehmen diesen Adressraum gekauft hat. Eine eindeutige Postleitzahl gilt für großvolumige oder konzentrierte Lieferräume. Alles, was an die Postleitzahl 12345 adressiert ist, geht an General Electric in Schenectady, NY. Dieses Beispiel wird niemanden besonders erreichen, aber der USPS könnte es trotzdem liefern.
Nummer 5 ist auch vollständig, ob Sie es glauben oder nicht. Mit nur diesen Nummern kann die vollständige Adresse ermittelt werden, wenn sie anhand einer Datenbank aller möglichen Adressen analysiert wird. Das Ausfüllen der fehlenden Anweisungen, des sekundären Bezeichners und der Postleitzahl + 4 ist trivial, wenn Sie jede Nummer als Komponente sehen. So sieht es aus, vollständig erweitert und standardisiert:
205 N 1105 W Apt 14
Beverly Hills CA 90210-5221
Adressdaten sind nicht Ihre eigenen
In den meisten Ländern, die lizenzierten Anbietern offizielle Adressdaten zur Verfügung stellen, gehören die Adressdaten selbst der zuständigen Behörde. In den USA besitzt der USPS die Adressen. Gleiches gilt für Canada Post, Royal Mail und andere, obwohl jedes Land das Eigentum ein wenig anders erzwingt oder definiert. Dies zu wissen ist wichtig, da es normalerweise das Reverse Engineering der Adressdatenbank verbietet. Sie müssen vorsichtig sein, wie Sie die Daten erfassen, speichern und verwenden.
Google Maps ist eine häufige Anlaufstelle für schnelle Adresskorrekturen, aber die Nutzungsbedingungen sind eher unerschwinglich. Beispielsweise können Sie ihre Daten oder APIs nicht ohne Anzeige einer Google Map und nur für nichtkommerzielle Zwecke verwenden (es sei denn, Sie zahlen), und Sie können die Daten nicht speichern (außer für temporäres Caching). Macht Sinn. Die Daten von Google gehören zu den besten der Welt. Google Maps überprüft die Adresse jedoch nicht . Wenn eine Adresse nicht existiert, wird es noch zeigen Ihnen , wo die Adresse wäre , wenn es tat exist (versuchen Sie es auf Ihrem eigenen Straße, verwenden Sie eine Hausnummer , dass Sie wissen , ist nicht vorhanden). Dies ist manchmal nützlich, aber seien Sie sich dessen bewusst.
Die Nutzungsrichtlinien von Nominatim sind ähnlich einschränkend, insbesondere für großvolumige und kommerzielle Zwecke. Die Daten stammen größtenteils aus freien Quellen und sind daher nicht so gut gepflegt (wie dies bei offenen Projekten der Fall ist). Dies kann jedoch weiterhin zutreffen Deine Bedürfnisse. Es wird von einer großartigen Community unterstützt.
Der USPS selbst verfügt über eine API, die jedoch stark abnimmt und weder Garantien noch Unterstützung bietet . Es könnte auch schwer zu bedienen sein. Einige Leute verwenden es sparsam und ohne Probleme. Es ist jedoch leicht zu übersehen, dass der USPS verlangt, dass Sie seine API nur zur Bestätigung von Adressen verwenden, um sie zu versenden.
Die Leute erwarten, dass Adressen schwierig sind
Leider haben wir unsere Gesellschaft darauf konditioniert, dass Adressen kompliziert sein werden. Es gibt Dutzende guter UX-Artikel im Internet darüber. Wenn Sie jedoch ein Adressformular mit einzelnen Feldern haben, erwarten die Benutzer dies, auch wenn es für Edge-Case-Adressen, die nicht zu den Adressen passen, schwieriger ist Format, das das Formular erwartet, oder möglicherweise erfordert das Formular ein Feld, das es nicht sollte. Oder Benutzer wissen nicht, wo sie einen bestimmten Teil ihrer Adresse ablegen sollen.
Ich könnte heutzutage immer wieder über die schlechte UX von Checkout-Formularen sprechen, aber stattdessen möchte ich nur sagen, dass das Kombinieren der Adressen in einem einzigen Feld eine willkommene Änderung ist - die Leute können ihre Adresse so eingeben, wie sie es für richtig halten , anstatt zu versuchen, Ihre lange Form herauszufinden. Diese Änderung ist jedoch unerwartet und kann für Benutzer zunächst etwas unangenehm sein. Sei dir dessen einfach bewusst.
Ein Teil dieser Schmerzen kann gelindert werden, indem das Feld vor die Adresse gestellt wird. Wenn sie zuerst das Länderfeld ausfüllen, wissen Sie, wie Sie Ihr Formular anzeigen können. Vielleicht haben Sie eine gute Möglichkeit, mit US-Adressen mit einem Feld umzugehen. Wenn sie also USA auswählen, können Sie Ihr Formular auf ein einzelnes Feld reduzieren, andernfalls werden die Komponentenfelder angezeigt. Nur Dinge zum Nachdenken!
Jetzt wissen wir, warum es schwer ist; Was können Sie dagegen tun?
Der USPS lizenziert Anbieter über einen Prozess namens CASS ™ -Zertifizierung, um Kunden verifizierte Adressen bereitzustellen. Diese Anbieter haben Zugriff auf die USPS-Datenbank, die monatlich aktualisiert wird. Ihre Software muss strengen Standards entsprechen, um zertifiziert zu werden, und sie erfordern nicht oft die Zustimmung zu den oben beschriebenen einschränkenden Bedingungen.
Es gibt viele CASS-zertifizierte Unternehmen, die Listen verarbeiten können oder über APIs verfügen: Melissa Data, Experian QAS und SmartyStreets, um nur einige zu nennen.
(Da ich wegen "Werbung" Flak bekomme, habe ich meine Antwort an dieser Stelle abgeschnitten. Es liegt an Ihnen, eine Lösung zu finden, die für Sie funktioniert.)
Die Wahrheit: Wirklich, Leute, ich arbeite in keiner dieser Firmen. Es ist keine Werbung.