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

これを行う必要があるのは、2 つの別々のデバイスの位置を最新の通りの名前で比較できるようにするためです。デバイスが「99 King St W」にある場合、「113 King St W」または「113a King St W」と同じ通りにあります。

現状では、課す規則が多すぎて、ストリート名の多様性が私に不利に働いているため、正規表現が信頼できる優れたソリューションであるとは思いません。理論的には、「1 1st St」を正規化する正規表現に失敗する「1 St」という通りが存在する可能性があります。

独自のファジー マッチャーを作成すると、より良い結果が得られる可能性がありますが、通りの名前が短い場合は失敗する可能性があります。

REST Web サービスへのクエリも検討しましたが、無料サービスの多くは 1 日あたりのリクエスト数に制限があるか、リクエスト間の最小時間が制限されているため、そのメソッドが高価になりすぎます。

私が言うように、皆さんが思いつくことができるものを聞きたいです.

とても有難い :)

4

2 に答える 2

2

説明

St この正規表現は、通りまたは大通りを探しAve、前の単語と行の残りをキャプチャします。"xxx street" と呼ばれる通り以外にもテストを拡張したい場合は、 allowStまたはincaseという式を作成しました。AveSt(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 に答える