Vi esta pregunta mucho cuando trabajaba para una compañía de verificación de direcciones. Estoy publicando la respuesta aquí para que sea más accesible para los programadores que están buscando la misma pregunta. La compañía en la que estaba procesó miles de millones de direcciones, y aprendimos mucho en el proceso.
Primero, necesitamos entender algunas cosas sobre las direcciones.
Las direcciones no son regulares.
Esto significa que las expresiones regulares están fuera. Lo he visto todo, desde simples expresiones regulares que coinciden con direcciones en un formato muy específico, hasta esto:
/ \ 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}) (corte | ct | calle | st | unidad | dr | carril | ln | carretera | 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
... a esto donde un archivo de clase de línea 900+ genera una expresión regular supermasiva sobre la marcha para que coincida aún más. No recomiendo estos (por ejemplo, aquí hay un violín de la expresión regular anterior, que comete muchos errores ). No hay una fórmula mágica fácil para que esto funcione. En teoría y por teoría, no es posible hacer coincidir direcciones con una expresión regular.
La Publicación 28 de USPS documenta los diversos formatos de direcciones que son posibles, con todas sus palabras clave y variantes. Lo peor de todo, las direcciones son a menudo ambiguas. Las palabras pueden significar más de una cosa ("St" puede ser "Saint" o "Street") y hay palabras que estoy bastante seguro de que inventaron. (¿Quién sabía que "Stravenue" era un sufijo callejero?)
Necesitaría un código que realmente comprenda las direcciones, y si ese código existe, es un secreto comercial. Pero probablemente podrías rodar el tuyo si realmente te gusta eso.
Las direcciones vienen en formas y tamaños inesperados
Aquí hay algunas direcciones artificiales (pero completas):
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Incluso estos son posiblemente válidos:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Obviamente, estos no están estandarizados. La puntuación y los saltos de línea no están garantizados. Esto es lo que está pasando:
El número 1 está completo porque contiene una dirección y una ciudad y estado. Con esa información, hay suficiente identificación de la dirección, y puede considerarse "entregable" (con cierta estandarización).
El número 2 está completo porque también contiene una dirección (con número secundario / de unidad) y un código postal de 5 dígitos, que es suficiente para identificar una dirección.
El número 3 es un formato completo de apartado postal, ya que contiene un código postal.
El número 4 también está completo porque el código postal es único , lo que significa que una entidad o corporación privada ha comprado ese espacio de direcciones. Un código postal único es para espacios de entrega de gran volumen o concentrados. Cualquier cosa dirigida al código postal 12345 va a General Electric en Schenectady, NY. Este ejemplo no llegará a nadie en particular, pero USPS aún podría entregarlo.
El número 5 también está completo, lo creas o no. Con solo esos números, se puede descubrir la dirección completa cuando se analiza en una base de datos de todas las direcciones posibles. Completar los direccionales faltantes, el designador secundario y el código ZIP + 4 es trivial cuando ve cada número como un componente. Así es como se ve, completamente expandido y estandarizado:
205 N 1105 W Apto 14
Beverly Hills CA 90210-5221
Los datos de la dirección no son tuyos
En la mayoría de los países que proporcionan datos de direcciones oficiales a proveedores con licencia, los datos de direcciones pertenecen a la agencia gubernamental. En los Estados Unidos, el USPS posee las direcciones. Lo mismo es cierto para Canada Post, Royal Mail y otros, aunque cada país hace cumplir o define la propiedad de manera un poco diferente. Saber esto es importante, ya que generalmente prohíbe la ingeniería inversa de la base de datos de direcciones. Debe tener cuidado de cómo adquirir, almacenar y usar los datos.
Google Maps es un recurso común para soluciones rápidas de direcciones, pero el TOS es bastante prohibitivo; por ejemplo, no puede usar sus datos o API sin mostrar un mapa de Google, y solo para fines no comerciales (a menos que pague), y no puede almacenar los datos (excepto para el almacenamiento en caché temporal). Tiene sentido. Los datos de Google son algunos de los mejores del mundo. Sin embargo, Google Maps no verifica la dirección. Si no existe una dirección, aún le mostrará dónde estaría la dirección si lo hiciera existe (probarlo en su propia calle, el uso de un número de casa que sabes no existe). Esto es útil a veces, pero ten en cuenta eso.
La política de uso de Nominatim es similarmente limitante, especialmente para un gran volumen y uso comercial, y los datos se obtienen principalmente de fuentes gratuitas, por lo que no están tan bien mantenidos (tal es la naturaleza de los proyectos abiertos); sin embargo, esto puede ser adecuado tus necesidades. Es apoyado por una gran comunidad.
El propio USPS tiene una API, pero se cae mucho y viene sin garantías ni soporte. También puede ser difícil de usar. Algunas personas lo usan con moderación sin problemas. Pero es fácil pasar por alto que USPS requiere que use su API solo para confirmar las direcciones para enviarlas.
La gente espera que las direcciones sean difíciles
Desafortunadamente, hemos condicionado a nuestra sociedad a esperar que las direcciones sean complicadas. Hay docenas de buenos artículos de experiencia de usuario en todo Internet sobre esto, pero el hecho es que, si tiene un formulario de dirección con campos individuales, eso es lo que esperan los usuarios, a pesar de que dificulta las direcciones de casos extremos que no se ajustan al formatee el formulario que espera, o tal vez el formulario requiere un campo que no debería. O los usuarios no saben dónde poner una determinada parte de su dirección.
Podría seguir y seguir sobre la mala experiencia de usuario de los formularios de pago en estos días, pero en cambio solo diré que combinar las direcciones en un solo campo será un cambio bienvenido : las personas podrán escribir su dirección como mejor les parezca , en lugar de tratar de averiguar su forma larga. Sin embargo, este cambio será inesperado y los usuarios pueden encontrarlo un poco discordante al principio. Solo ten cuidado con eso.
Parte de este dolor se puede aliviar colocando el campo del país al frente, antes de la dirección. Cuando primero completan el campo del país, usted sabe cómo hacer que aparezca su formulario. Tal vez tenga una buena manera de tratar con direcciones de EE. UU. De un solo campo, por lo que si seleccionan Estados Unidos, puede reducir su formulario a un solo campo, de lo contrario, muestre los campos componentes. ¡Solo cosas para pensar!
Ahora sabemos por qué es difícil; ¿Qué puedes hacer al respecto?
El USPS otorga licencias a los proveedores a través de un proceso llamado Certificación CASS ™ para proporcionar direcciones verificadas a los clientes. Estos proveedores tienen acceso a la base de datos de USPS, actualizada mensualmente. Su software debe cumplir con estándares rigurosos para ser certificado, y no requieren a menudo el acuerdo con términos tan limitados como se discutió anteriormente.
Hay muchas compañías con certificación CASS que pueden procesar listas o tener API: Melissa Data, Experian QAS y SmartyStreets, por nombrar algunas.
(Debido a las críticas por la "publicidad", he truncado mi respuesta en este momento. Depende de usted encontrar una solución que funcione para usted).
La verdad: amigos, no trabajo en ninguna de estas compañías. No es un anuncio publicitario.