Я часто видел этот вопрос, когда работал в компании по проверке адресов. Я публикую ответ здесь, чтобы сделать его более доступным для программистов, которые ищут тот же вопрос. Компания, в которой я работал, обрабатывала миллиарды адресов, и мы многому научились в процессе.
Во-первых, нам нужно кое-что понять об адресах.
Это означает, что регулярные выражения отсутствуют. Я видел все это, от простых регулярных выражений, которые соответствуют адресам в очень конкретном формате, до этого:
/ \ S + (\ d {2,5} \ S +) ([а | р]?! Т \ б) (([A-Za-Z | \ S +] {1,5}) {1,2}) ? ([\ s |, |.] +) (([A-Za-Z | \ s +] {1,30}) {1,4})? (суд | кт | улица | й | привод | др | полоса | пер | дорога | й | б-р) ([\ s |, | |;.]? +) (([A-Za-Z | \ s +] {1,30}) {1,2}) ([ \ s |, |.] +) \ б (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 | МО | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | ИЛИ | PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s |, |.] +) (\ s + \ д {5}) ([\ s |, |.]? +) / я
... к этому, где файл класса строк из 900+ генерирует сверхмассивное регулярное выражение на лету, чтобы соответствовать еще большему количеству. Я не рекомендую их (например, вот скрипка из приведенного выше регулярного выражения, которая допускает множество ошибок ). Нет простой волшебной формулы, чтобы заставить это работать. В теории и по теории, это не представляется возможным , чтобы соответствовать адреса с регулярным выражением.
Публикация USPS 28 документирует множество возможных форматов адресов со всеми их ключевыми словами и вариантами. Хуже всего то, что адреса часто неоднозначны. Слова могут означать больше, чем одно («Святой» может быть «Святой» или «Улица»), и есть слова, которые, я уверен, они изобрели. (Кто знал, что "Стрэйвен" был уличным суффиксом?)
Вам понадобится код, который действительно понимает адреса, и если этот код существует, это коммерческая тайна. Но вы, вероятно, можете свернуть свои собственные, если вы действительно в этом.
Адреса бывают неожиданной формы и размера
Вот некоторые придуманные (но полные) адреса:
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, кв. 14
Беверли-Хиллз, Калифорния, 90210-5221
Адресные данные не ваши
В большинстве стран, которые предоставляют официальные адресные данные лицензированным поставщикам, сами адресные данные принадлежат управляющему агентству. В США USPS владеет адресами. То же самое верно и для Почты Канады, Королевской почты и других, хотя в каждой стране право собственности определяется или определяется по-своему. Знание этого важно, так как обычно оно запрещает обратный инжиниринг базы данных адресов. Вы должны быть осторожны при получении, хранении и использовании данных.
Карты Google - обычное средство для быстрого исправления адресов, но TOS довольно запретительны; например, вы не можете использовать их данные или API-интерфейсы без отображения карты Google и только для некоммерческих целей (если вы не платите), а также вы не можете хранить данные (за исключением временного кэширования). Имеет смысл. Данные Google являются одними из лучших в мире. Однако Google Maps не проверяет адрес. Если адрес не существует, он еще покажет вам , где адрес будет , если он действительно существует (попробовать на собственной улице, используйте номер дома , который вы знаете , не существует). Иногда это полезно, но помните об этом.
Политика использования Nominatim также ограничивает, особенно для больших объемов и коммерческого использования, и данные в основном берутся из бесплатных источников, поэтому они не так хорошо поддерживаются (такова природа открытых проектов) - однако, это может все же подойти твои нужды. Его поддерживает большое сообщество.
У самого USPS есть API, но он сильно падает и не имеет никаких гарантий и поддержки. Это также может быть сложно использовать. Некоторые люди используют его экономно, без проблем. Но легко не заметить, что USPS требует, чтобы вы использовали их API только для подтверждения адресов для доставки через них.
Люди ожидают, что адреса будут сложными
К сожалению, мы заставили наше общество ожидать, что адреса будут сложными. По всему Интернету есть десятки хороших статей по UX, но факт в том, что если у вас есть адресная форма с отдельными полями, это то, чего ожидают пользователи, даже если это усложняет работу с крайними адресами, которые не соответствуют отформатируйте ожидаемую форму, или, возможно, для формы требуется поле, которого не должно быть. Или пользователи не знают, где разместить определенную часть своего адреса.
В наши дни я мог бы продолжать и говорить о плохом UX форм оформления заказа, но вместо этого я просто скажу, что объединение адресов в одно поле будет долгожданным изменением - люди смогут вводить свой адрес так, как они считают нужным. вместо того, чтобы пытаться выяснить вашу длинную форму. Однако это изменение будет неожиданным и поначалу может показаться пользователям немного неприятным. Просто знайте об этом.
Частично эту боль можно облегчить, поместив поле страны перед адресом. Когда они сначала заполняют поле страны, вы знаете, как сделать так, чтобы ваша форма отображалась. Возможно, у вас есть хороший способ справиться с адресами в США из одного поля, поэтому, если они выбирают Соединенные Штаты, вы можете свести форму к одному полю, в противном случае отобразить поля компонента. Просто вещи для размышления!
Теперь мы знаем, почему это сложно; Что вы можете сделать по этому поводу?
USPS лицензирует поставщиков через процесс, называемый CASS ™ Certification, для предоставления клиентам проверенных адресов. Эти поставщики имеют доступ к базе данных USPS, обновляемой ежемесячно. Их программное обеспечение должно соответствовать строгим стандартам для сертификации, и они не часто требуют согласия на такие ограничивающие условия, как описано выше.
Существует много компаний, сертифицированных CASS, которые могут обрабатывать списки или иметь API: Melissa Data, Experian QAS и SmartyStreets.
(В связи с тем, что я получил «рекламу», я обрезал свой ответ на этом этапе. Вам решать, какое решение подойдет вам.)
Правда: действительно, ребята, я не работаю ни в одной из этих компаний. Это не реклама.