0

我已经为此奋斗了一段时间,所以希望有人可以帮助我。我愿意接受任何和所有建议。

当我查询时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 St”的街道,它将无法通过正则表达式规范化“1 1st St”。

编写我自己的模糊匹配器可能会提供更好的结果,但对于较短的街道名称可能会失败。

我还考虑过查询 REST Web 服务,但是许多免费服务对每天的请求有限制,或者请求之间的最短时间会导致该方法过于昂贵。

就像我说的,我很想听听你们能想出什么。

非常感激 :)

4

2 回答 2

2

描述

此正则表达式将查找街道St 或大道Ave并捕获前面的单词和该行的其余部分。如果您的用例需要 just然后将 替换为just ,我使表达式允许StAve以防您想将测试扩展到仅称为“xxx 街道”的街道之外。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
        )

)
于 2013-06-06T17:32:43.357 回答
2

正如我在评论中所说,这里的问题是提出了错误的问题。但是,如果您必须这样做,并且您可以排除邮政信箱(字符串以数字结尾?),并且您将自己限制在美国的地址(因为您不会相信您在英国看到的某些东西),那么您可以从检测一个前导数字开始,然后附加没有用空格分隔的所有内容。这几乎不是完美的,因为总会有人写作"99 A King St.",而不是"99a King St."。(但是,首先,是街道的名称"King St."还是"A King St."?除非你自己知道这条街道,否则你不能确定。)这个的正则表达式是"\\d+\\w*". 除此之外,您可以对结果尝试某些启发式方法:如果它们是单个单词,则完全匹配"St", "Street","Ave"等(您可能应该检查大约 20 个不同的单词,"."在缩写的情况下有或没有尾随),然后你可能只有这条街。

但在开始之前,我会坚持让你查询作业。例如,众所周知,在输入地址时,您所能做的就是"First line:","Second line:"等。即使是询问邮政编码也可能很棘手。

于 2013-06-06T18:14:26.300 回答