Eu vi muito essa pergunta quando trabalhei para uma empresa de verificação de endereço. Estou postando a resposta aqui para torná-la mais acessível aos programadores que estão pesquisando com a mesma pergunta. A empresa em que eu estava processou bilhões de endereços e aprendemos muito no processo.
Primeiro, precisamos entender algumas coisas sobre endereços.
Os endereços não são regulares
Isso significa que expressões regulares estão fora. Eu já vi tudo, desde expressões regulares simples que correspondem a endereços em um formato muito específico, até isso:
/ \ 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}) (tribunal | ct | rua | st | drive | dr | faixa | ln | estrada | 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
... para isso, onde um arquivo com mais de 900 linhas de classe gera uma expressão regular supermassiva em tempo real para corresponder ainda mais. Eu não os recomendo (por exemplo, aqui está um violino do regex acima, que comete muitos erros ). Não existe uma fórmula mágica fácil para fazer isso funcionar. Na teoria e pela teoria, não é possível combinar endereços com uma expressão regular.
A Publicação USPS 28 documenta os muitos formatos de endereços possíveis, com todas as suas palavras-chave e variáveis. O pior de tudo é que os endereços geralmente são ambíguos. Palavras podem significar mais de uma coisa ("St" pode ser "Saint" ou "Street") e há palavras que eu tenho certeza que elas inventaram. (Quem sabia que "Stravenue" era um sufixo de rua?)
Você precisaria de algum código que realmente entendesse endereços e, se esse código existir, é um segredo comercial. Mas você provavelmente poderia fazer o seu próprio se realmente gostar disso.
Os endereços têm formatos e tamanhos inesperados
Aqui estão alguns endereços planejados (mas completos):
1) 102 main street
Anytown, state
2) 400n 600e #2, 52173
3) p.o. #104 60203
Mesmo estes são possivelmente válidos:
4) 829 LKSDFJlkjsdflkjsdljf Bkpw 12345
5) 205 1105 14 90210
Obviamente, estes não são padronizados. Pontuação e quebras de linha não garantidas. Aqui está o que está acontecendo:
O número 1 está completo porque contém um endereço e uma cidade e estado. Com essas informações, basta identificar o endereço e ele pode ser considerado "entregável" (com alguma padronização).
O número 2 está completo porque também contém um endereço (com número de unidade / secundário) e um CEP de 5 dígitos, o suficiente para identificar um endereço.
O número 3 é um formato completo de caixa postal, pois contém um CEP.
O número 4 também está completo porque o CEP é único , o que significa que uma entidade ou empresa privada comprou esse espaço de endereço. Um código postal exclusivo é para espaços de entrega de alto volume ou concentrados. Qualquer coisa endereçada ao CEP 12345 vai para a General Electric em Schenectady, NY. Este exemplo não alcançará ninguém em particular, mas o USPS ainda seria capaz de entregá-lo.
O número 5 também está completo, acredite ou não. Com apenas esses números, o endereço completo pode ser descoberto quando analisado em um banco de dados de todos os endereços possíveis. O preenchimento dos direcionais ausentes, designador secundário e código ZIP + 4 é trivial quando você vê cada número como um componente. Veja como é, totalmente expandido e padronizado:
205 N 1105 W Apt 14
Beverly Hills CA 90210-5221
Os dados do endereço não são seus
Na maioria dos países que fornecem dados oficiais de endereço a fornecedores licenciados, os próprios dados de endereço pertencem à agência governamental. Nos EUA, o USPS possui os endereços. O mesmo vale para o Canada Post, o Royal Mail e outros, embora cada país imponha ou defina a propriedade de maneira um pouco diferente. Saber disso é importante, pois geralmente proíbe a engenharia reversa do banco de dados de endereços. Você deve ter cuidado ao adquirir, armazenar e usar os dados.
O Google Maps é uma ferramenta comum para correções rápidas de endereços, mas os Termos de Serviço são proibitivos; por exemplo, você não pode usar os dados ou APIs sem mostrar um mapa do Google e apenas para fins não comerciais (a menos que pague) e não pode armazenar os dados (exceto para cache temporário). Faz sentido. Os dados do Google são alguns dos melhores do mundo. No entanto, o Google Maps não verifica o endereço. Se um endereço não existe, ele ainda vai mostrar onde o endereço iria ser se fez exist (experimentá-lo em sua própria rua, use um número de casa que você sabe que não existe). Isso às vezes é útil, mas esteja ciente disso.
A política de uso da Nominatim é similarmente limitada, especialmente para uso comercial e de alto volume, e os dados são extraídos principalmente de fontes gratuitas, portanto, não são tão bem mantidos (como é a natureza dos projetos abertos) - no entanto, isso ainda pode ser adequado suas necessidades. É apoiado por uma grande comunidade.
O USPS em si tem uma API, mas diminui bastante e vem sem garantias nem suporte. Também pode ser difícil de usar. Algumas pessoas o usam com moderação, sem problemas. Mas é fácil perder que o USPS exige que você use a API deles apenas para confirmar endereços para enviá-los.
As pessoas esperam que endereços sejam difíceis
Infelizmente, condicionamos nossa sociedade a esperar que endereços sejam complicados. Existem dezenas de bons artigos de UX em toda a Internet sobre isso, mas o fato é que, se você tiver um formulário de endereço com campos individuais, é isso que os usuários esperam, mesmo que isso dificulte os endereços de ponta que não se encaixam no padrão. formato que o formulário está esperando, ou talvez o formulário exija um campo que não deveria. Ou os usuários não sabem onde colocar uma determinada parte do endereço.
Eu poderia continuar falando sobre o UX ruim dos formulários de checkout hoje em dia, mas, em vez disso, direi que combinar os endereços em um único campo será uma mudança bem - vinda - as pessoas poderão digitar seu endereço como acharem melhor , em vez de tentar descobrir seu formulário longo. No entanto, essa alteração será inesperada e os usuários podem achar um pouco chocantes no início. Apenas esteja ciente disso.
Parte dessa dor pode ser aliviada colocando o campo do país na frente, antes do endereço. Quando eles preenchem o campo do país primeiro, você sabe como fazer seu formulário aparecer. Talvez você tenha uma boa maneira de lidar com endereços dos EUA em um único campo; portanto, se eles selecionarem Estados Unidos, você poderá reduzir seu formulário para um único campo; caso contrário, mostre os campos dos componentes. Apenas coisas para pensar!
Agora sabemos porque é difícil; o que você pode fazer sobre isso?
O USPS licencia os fornecedores através de um processo chamado Certificação CASS ™ para fornecer endereços verificados aos clientes. Esses fornecedores têm acesso ao banco de dados USPS, atualizado mensalmente. Seu software deve estar em conformidade com padrões rigorosos para ser certificado e, muitas vezes, eles não exigem concordância com os termos limitantes mencionados acima.
Existem muitas empresas com certificação CASS que podem processar listas ou ter APIs: Melissa Data, Experian QAS e SmartyStreets, entre outras.
(Devido a ser criticado por "publicidade", truncei minha resposta neste momento. Cabe a você encontrar uma solução que funcione para você.)
A verdade: Realmente, pessoal, não trabalho em nenhuma dessas empresas. Não é um anúncio.