我一直在与此作斗争,所以希望有人可以帮助我。我愿意接受任何建议。
当我查询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服务,但是许多免费服务对每天的请求有限制,或者请求之间的最短时间会导致该方法过于昂贵。
就像我说的那样,我很想听听你们可以提出的建议。
非常感谢:)
答案 0 :(得分:2)
此正则表达式将查找街道St
或大道Ave
并捕获前一个单词和其余行。如果您的用例仅需要St
,则替换Ave
,我将表达式设为允许St
或(St|Ave)
,以便将测试扩展到名为“xxx street”的街道之外。只有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
)
)
答案 1 :(得分:2)
"99 A King St."
,而不是
比"99a King St."
。 (但是,在第一个,是的名称
街道"King St."
或"A King St."
?除非你知道
街头自己,你不能确定。)正则表达式
这将是"\\d+\\w*"
。除此之外,你可以尝试一下
结果的启发式:如果它们是一个单词,那么确切
匹配"St"
,"Street"
,"Ave"
等(可能有
大约20个不同的词你应该检查,有或没有
在缩写的情况下尾随"."
,那么你可能
只有这条街。
但在开始之前,我会坚持要求你查询
分配。例如,众所周知,输入时
地址,您可以做的只有"First line:"
,"Second
line:"
等。即使要求邮政编码也很棘手。