Я боролся с этим некоторое время, так что, надеюсь, кто-нибудь может мне помочь. Я открыт для любых предложений.
Когда я запрашиваю 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, однако многие бесплатные сервисы имеют ограничения по запросам в день или минимальное время между запросами, которое может сделать этот метод слишком дорогим.
Как я уже сказал, я хотел бы услышать, что вы, ребята, можете придумать.
Очень признателен 🙂
Как я уже сказал в комментариях, проблема в том, что неправильно
вопрос задают. Но если вам нужно, а также вы можете
исключить почтовые ящики (строка заканчивается на число?), а также вы ограничиваете
сами по адресам в США (потому что вы не поверите
некоторые вещи, которые вы видите в Великобритании), то вы могли бы начать с
обнаружение ведущего числа, затем добавление всего, что не
отделен от него пробелом. Это вряд ли идеально, потому что
всегда будут люди, которые пишут "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
)
)