質問
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
痛い!標準化されたアドレスで作業している場合を除き、アドレス自体の解析は非常に厄介です。この理由は、「プライマリ番号」が多くの場合、ハウス番号と呼ばれます。たとえば、文字列内のさまざまな場所にあります。
- RR 2ボックス15(RRはRural Route、HC、HCRなどでもかまいません)
- 私書箱17
- 12B-7A
- NW95E235
- など
これは簡単なアンダータックではありません。アプリケーションのニーズに応じて、アドレス検証Webサービスを利用することをお勧めします。正確な情報を取得することです。この機能を提供するプロバイダーはいくつかあります。
完全な開示のために、私はSmartyStreetsの創設者です。 アドレス検証WebサービスAPI を使用して、アドレスを検証および標準化して確認します。それは本物であり、プライマリ/ハウス番号の部分を取得することができます。個人的に質問で私に連絡してください。
/ [^ \ d] + $ /
も、キャプチャグループを使用しないことを除いて同じものに一致します。
今後の参照用に、正規表現を支援する優れたツールは http://www.rubular.com/