仅针对街道名称解析QGeoAddress :: street()

时间:2013-06-06 17:03:07

标签: c++ regex qt rest location-based-service

我一直在与此作斗争,所以希望有人可以帮助我。我愿意接受任何建议。

当我查询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服务,但是许多免费服务对每天的请求有限制,或者请求之间的最短时间会导致该方法过于昂贵。

就像我说的那样,我很想听听你们可以提出的建议。

非常感谢:)

2 个答案:

答案 0 :(得分:2)

描述

此正则表达式将查找街道St或大道Ave并捕获前一个单词和其余行。如果您的用例仅需要St,则替换Ave,我将表达式设为允许St(St|Ave),以便将测试扩展到名为“xxx street”的街道之外。只有St

(\b\S*\b\s(St|Ave)\b.*?)$

enter image description here

实施例

我只包含这个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
        )

)

答案 1 :(得分:2)

正如我在评论中所说,这里的问题是错误的 问题正在被问到。但如果你必须,你可以 排除邮政信箱(字符串以数字结尾?),限制 你自己在美国的地址(因为你不相信 你在英国看到的一些事情,然后你可能会开始 检测一个前导号码,然后追加一些不是 与空间隔开。这并不完美,因为 总会有人写"99 A King St.",而不是 比"99a King St."。 (但是,在第一个,是的名称 街道"King St.""A King St."?除非你知道 街头自己,你不能确定。)正则表达式 这将是"\\d+\\w*"。除此之外,你可以尝试一下 结果的启发式:如果它们是一个单词,那么确切 匹配"St""Street""Ave"等(可能有 大约20个不同的词你应该检查,有或没有 在缩写的情况下尾随".",那么你可能 只有这条街。

但在开始之前,我会坚持要求你查询 分配。例如,众所周知,输入时 地址,您可以做的只有"First line:""Second line:"等。即使要求邮政编码也很棘手。