Разбор QGeoAddress::street() только для названия улицы
Я боролся с этим некоторое время, так что, надеюсь, кто-то может мне помочь. Я открыт для любых предложений.
Когда я запрашиваю QGeoAddress::street()
Я (могу) получить номер улицы и название улицы. Я хотел бы получить только название улицы.
Пример:
King St W -> King St W
99 King St W -> King St W
99a King St W -> King St W ...
1st St -> 1st St
99 1st St -> 1st St
99a 1st St -> 1st St ...
315 W. 42nd -> W. 42nd
42 St. Paul Drive -> St. Paul Drive
Мне нужно сделать так, чтобы местоположение двух отдельных устройств можно было сравнить по самому последнему названию улицы. Если устройство находится по адресу "99 King St W", оно находится на той же улице, что и "113 King St W" или "113a King St W".
В настоящее время я не верю, что регулярное выражение является хорошим и надежным решением, поскольку слишком много правил, которые нужно навязать, и изменчивость названий улиц работает против меня. Теоретически, может существовать улица с именем "1-й Санкт-Петербург", которая не справится с регулярным выражением, нормализующим "1-й Санкт-Петербург".
Написание моего собственного нечеткого сопоставления может дать лучшие результаты, но может не сработать для более коротких названий улиц.
Я также рассмотрел запрос к веб-сервису REST, однако многие бесплатные сервисы имеют ограничения на количество запросов в день или минимальное время между запросами, которое делает этот метод слишком дорогим.
Как я уже сказал, я хотел бы услышать, что вы, ребята, можете придумать.
Очень признателен:)
2 ответа
Как я сказал в комментариях, проблема в том, что задают не тот вопрос. Но если вам нужно, и вы можете исключить почтовые ящики (строка заканчивается цифрой?), И вы ограничиваетесь адресами в США (потому что вы не поверите некоторым вещам, которые вы видите в Великобритании), тогда Вы можете начать с определения начального числа, а затем добавить все, что не отделено от него пробелом. Это вряд ли идеально, потому что всегда будут люди, которые пишут "99 A King St."
, скорее, чем "99a King St."
, (Но тогда, во-первых, это название улицы "King St."
или же "A King St."
? Если вы не знаете улицу сами, вы не можете быть уверены.) Регулярное выражение для этого будет "\\d+\\w*"
, Кроме того, вы можете попробовать определенные эвристические методы с результатами: если они представляют собой одно слово, точно совпадающее "St"
, "Street"
, "Ave"
и т. д. (вероятно, вам нужно проверить около 20 разных слов, с трейлингом или без него) "."
в случае аббревиатур) то у вас наверное только улица.
Но прежде чем начать, я бы настаивал, чтобы вы запросили назначение. Хорошо известно, например, что при вводе адресов все, что вы можете сделать, это "First line:"
, "Second
line:"
и т.д. Даже запросить почтовый индекс может быть сложно.
Описание
Это регулярное выражение будет искать улицу St
или проспект Ave
и захватить предыдущее слово и остальную часть строки. Я сделал выражение разрешить St
или же Ave
если вы хотите расширить тест за пределы улиц, называемых просто "улица ххх", если ваш вариант использования требует St
затем заменить (St|Ave)
просто St
,
(\b\S*\b\s(St|Ave)\b.*?)$
пример
Я включил этот пример PHP только для демонстрации того, как работает выражение и как будет выглядеть захват группы
<?php
$sourcestring="King St W
99 King St W
99a King St W
1st St
99 1st St
99a 1st St";
preg_match_all('/(\b\S*\b\s(St|Ave)\b.*?)$/m',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
$matches Array:
(
[0] => Array
(
[0] => King St W
[1] => King St W
[2] => King St W
[3] => 1st St
[4] => 1st St
[5] => 1st St
)
[1] => Array
(
[0] => King St W
[1] => King St W
[2] => King St W
[3] => 1st St
[4] => 1st St
[5] => 1st St
)
[2] => Array
(
[0] => St
[1] => St
[2] => St
[3] => St
[4] => St
[5] => St
)
)