質問

Ruby(newb)とRegexを使用して、番地から番地を解析しようとしています。私は簡単なものに問題はありませんが、いくつかの助けが必要です:

'6223 1/2 S FIGUEROA ST' == gt; 「S FIGUEROA ST」

助けてくれてありがとう!!

更新:

'6223 1/2 2ND ST' == gt; 「2nd ST」

および@pestoから '221B Baker Street' ==> 「ベイカーストリート」

役に立ちましたか?

解決

これにより、文字に達するまで文字列の前にあるものはすべて削除されます。

street_name = address.gsub(/^[^a-zA-Z]*/, '')

「221B Baker Street」のようなものを作成できる場合は、もっと複雑なものを使用する必要があります。これは動作するはずです:

street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')

他のヒント

グループマッチング:

.*\d\s(.*)

アパート番号も考慮する必要がある場合:

.*\d.*?\s(.*)

123Aのストリート名を処理します

これは、文字列に他の数字がない限り、先頭の数字(およびスペース)を取り除きます。最初のグループ(。*)をキャプチャするだけです

別のstackoverflowセットの答えがあります: 解析可能な使用可能な番地、市、州、郵便番号文字列

google / yahooデコーダーのアプローチは最適だと思いますが、話しているアドレスの数/多くのアドレスに依存します-そうでなければ、選択された答えがおそらく最高でしょう

通りの名前も数字にすることができますか?例:

1234 45TH ST

または偶数

1234 45 ST

上記の最初のケースに対処できますが、2番目のケースは困難です。

アドレスをスペースで分割し、文字を含まない先行コンポーネントをすべてスキップしてから、残りを結合します。私はRubyを知らないが、ここに私のアプローチの問題を強調するPerlの例がある:

#!/usr/bin/perl

use strict;
use warnings;

my @addrs = (
    '6223 1/2 S FIGUEROA ST',
    '1234 45TH ST',
    '1234 45 ST',
);

for my $addr ( @addrs ) {
    my @parts = split / /, $addr;

    while ( @parts ) {
        my $part = shift @parts;
        if ( $part =~ /[A-Z]/ ) {
            print join(' ', $part, @parts), "\n";
            last;
        }
    }
}

C:\Temp> skip
S FIGUEROA ST
45TH ST
ST

痛い!標準化されたアドレスで作業している場合を除き、アドレス自体の解析は非常に厄介です。この理由は、「プライマリ番号」が多くの場合、ハウス番号と呼ばれます。たとえば、文字列内のさまざまな場所にあります。

  1. RR 2ボックス15(RRはRural Route、HC、HCRなどでもかまいません)
  2. 私書箱17
  3. 12B-7A
  4. NW95E235
  5. など

これは簡単なアンダータックではありません。アプリケーションのニーズに応じて、アドレス検証Webサービスを利用することをお勧めします。正確な情報を取得することです。この機能を提供するプロバイダーはいくつかあります。

完全な開示のために、私はSmartyStreetsの創設者です。 アドレス検証WebサービスAPI を使用して、アドレスを検証および標準化して確認します。それは本物であり、プライマリ/ハウス番号の部分を取得することができます。個人的に質問で私に連絡してください。

/ [^ \ d] + $ / も、キャプチャグループを使用しないことを除いて同じものに一致します。

今後の参照用に、正規表現を支援する優れたツールは http://www.rubular.com/

scroll top