iOS - проверьте правильность почтового адреса на монтажном столе
Я ищу несколько советов о том, как я могу проверить монтажную панель в iOS для правильного почтового адреса.
Если кто-то вставит
1234 Apple Street New York, NY 10011
Он анализирует каждую часть строки, чтобы заполнить адрес, город, штат и почтовый индекс. Это может быть любой адрес, и было бы идеально, если бы его можно было найти внутри более длинной строки.
Например
Hey guys meet me at 1234 Apple Street New York, NY 10011 See you there!
По-прежнему будет анализировать правильный адрес, город, штат и почтовый индекс.
Любая помощь приветствуется!
-Wes
2 ответа
Я был разработчиком на SmartyStreets. Мы были немного без ума от уличных адресов, а уличные адреса сводили меня с ума (особенно их разбор). Это улица с двусторонним движением. (Я закончил с уличными играми?)
Во-первых, давайте поговорим о случае, когда адрес сам по себе, потому что это проще, хотя все еще сложно...
Пожалуйста, обратитесь к этому другому вопросу и ответьте о том же самом. Я также настоятельно рекомендую вам перейти по ссылкам на соответствующие вопросы как в вопросе, так и в ответе. Парсинг адресов - это червь, но это не невозможно. Просто очень сложно сделать это надежно.
Обратите внимание в ответе на этот вопрос, во сколько разных форматов могут отображаться действительные адреса. Какие у вас гарантии, что пользователь будет вводить их в любом из них? И это только несколько. Есть и другие. Рассмотрим военные, почтовый ящик, сельский маршрут и другие "специальные" адреса, которые не соответствуют типичному формату. А как насчет адресов, которые имеют название города из двух или трех слов? А как насчет адресов, которые используют сеточную систему, такую как 100 N 500 E, или вторичные номера, такие как suite, apartment, floor и т. Д.? Как насчет адресов с "1/2", дефисами (как обязательная пунктуация) и т. Д.? Адреса отсутствуют почтовые индексы или город / штат?
Все это и многое другое может быть действительным. И это только для адресов США.
Если все ваши адреса, или даже большинство из них (что не так), пришли в форме, как вы предложили выше, например:
[Основной номер] [Название улицы] [ Любой из этих суффиксов улицы]
[Название города с запятой], [Сокращение штата] [5-значный почтовый индекс]
Тогда это будет довольно легко. Разве это не было бы хорошо?
Вы могли бы попытаться написать регулярное выражение, как этот парень или тот парень, но это работает, только если адреса являются обычным языком. Они не являются регулярными, и регулярные выражения не являются ответом.
Есть несколько служб, которые могут сделать это для вас, потому что у них есть основной список (вид), и программное обеспечение должно соответствовать строгим стандартам сертификации.
Очевидно, что поскольку я работаю на SmartyStreets, я склонен предлагать начать поиск ответа там. Вы можете попробовать адреса произвольной формы на домашней странице (просто заполните поле "Улица"). Но помните о нескольких вещах, которые, вероятно, всегда будут проблемой. LiveAddress API сможет анализировать адреса улиц для вас большую часть времени. Магазин вокруг, но это должно дать вам представление.
Теперь ваш второй вопрос: извлечь адрес улицы из строки текста. Это было подробно рассмотрено в других местах SO и межсетевых взаимодействий, поэтому я не буду вдаваться в подробности. В основном, чтобы сделать это надежно, вам, вероятно, потребуется некоторая обработка естественного языка и взаимодействие с человеком, чтобы подтвердить или исправить правильное предположение.
Никогда не думайте о нестандартных адресах:
- Начинается с числа
- Заканчивается числом
- Все между двумя числами является адресом
- Имеется почтовый индекс
- В адресе будет не более 2 номеров
- Это однозначно
- Это существует
- Уличный суффикс всегда будет присутствовать
- Написано правильно
- ...так далее.
Опять же, обратитесь к другим ссылкам на эту тему. Вы можете делать предположения, но всегда всегда есть человек, чтобы подтвердить предположение, если вы делаете это. (Некоторые приложения для Mac делают это. Если они обнаруживают адрес, он выделяется, и вы можете добавить этот адрес к своим контактам. К сожалению, я часто видел ложные срабатывания, а также пропускал их много.)
Удачи!
Я также работаю в SmartyStreets, и, поскольку я не являюсь разработчиком, я не связан какими-либо ограничениями, такими как "это невозможно сделать" или "нет способа сделать это надежно". На самом деле, идеи, которые я выдвигаю, не всегда возможны, но я решаю проблемы, ищу решения, и у этой конкретной проблемы есть решение.
Вам понадобится следующее: немного регулярных выражений, знание языка сценариев (python, php, что вы предпочитаете) и доступ к инструменту проверки адреса (это необходимо для того, чтобы вы знали, когда вы правильно поняли).
Итак, начнем с примера предложения:
Эй, ребята, встречайте меня на 1234 Apple Street Нью-Йорк, Нью-Йорк 10011 Увидимся там!
Мы можем быть уверены, что у каждого адреса есть начало и конец. (вы можете взять это в банк!)
Таким образом, если вы запустите регулярное выражение, которое ищет начало адреса в строке, вы можете удалить все до начала адреса. Вот регулярное выражение, которое будет делать именно это:
(^(.*(?=p\.?o\.? box|h\.?c\.?r\.? |c\.?m\.?r\.?)|^[^0-9]+))
Это вернет вам следующее:
1234 Apple Street Нью-Йорк, Нью-Йорк 10011 Увидимся там!
Теперь вы на полпути, но вам нужно перебрать оставшуюся строку. Еще одно предположение, которое вы, безусловно, можете сделать, заключается в том, что адрес никогда не будет длиннее 328 символов (я составил это число, но вы получите представление. У адреса тоже должен быть конец, и вы можете сократить строку, определив Максимально допустимая длина адреса USPS.)
Вы будете перебирать адресную строку, пока не получите из нее действительный адрес. Для этого начните с начала и двигайте одно слово вправо с каждой дополнительной перестановкой. Здесь вам пригодится служба проверки адресов, потому что вы не знаете, где заканчивается адрес, и это то, что вам нужно знать. Таким образом, каждая перестановка, которую вы генерируете из строки (помните, вы начинаете с левой стороны), будет отправлена на проверку. Поскольку ни один действительный адрес не может содержать менее двух слов, вы начнете с него. Вот перестановки из примера адреса, а также результаты проверки (я пробую каждый адрес, вводя его в адресную строку окна поиска адреса на smartystreets.com:
1234 Apple ==> провал
1234 Apple Street ==> не удалось
1234 Apple Street New ==> не удалось
1234 Apple Street New York ==> не удалось
1234 Apple Street, Нью-Йорк, Нью-Йорк ==> Бинго, правильный адрес совпадает. Нет необходимости повторять.
Очевидно, что это не правильный адрес, но вы можете попробовать то же самое с реальным адресом, и вы получите те же результаты. Очевидно, что это не самый сложный метод для извлечения действительного адреса из строки, но он, безусловно, работает. А так как SmartyStreets позволяет отправлять до 100 адресов на запрос, вы можете переставить строку адреса до 99 раз и получить результаты менее чем за 300 мс. Это не будет работать с каждым адресом, как вы наверняка узнаете, но он может очень легко справиться с большинством из них, независимо от того, насколько скрыт адрес в текстовой строке.
Итак, мы начали с этого Привет, ребята, встречайте меня на 1234 Apple Street Нью-Йорк, Нью-Йорк 10011 Увидимся там! и менее чем за полсекунды придумали эту 1234 Apple Street New York, NY 10011-1000.
Довольно круто, да? Это даже звучит очень легко, если не от программиста.
Давайте попробуем это с реальным адресом:
Эй, ребята, встречайте меня на 4219 Джон Янг Орландо FL 32839 Увидимся там!
Примените регулярное выражение, и вы получите:
4219 Джон Янг Орландо FL 32839 Увидимся там!
Перестановка, повторение, проверка:
4219 Джон ==> Не удалось
4219 Джон Янг ==> Не удалось
4219 Джон Янг Орландо ==> Не удалось
4219 jon young orlando fl ==> Бинго, правильный адрес совпадает.