2009-06-18 106 views
3

使用Ruby(newb)和正則表達式,我試圖從街道地址解析街道號碼。我並沒有與難辦的麻煩,但我需要一些幫助的:從街道地址剝離街道號碼

「6223 1/2秒FIGUEROA ST」 ==>的FIGUEROA ST'

感謝您的幫助!

UPDATE(S):

'6223 1/2 2ND ST' ==> '2ND ST'

和從@pesto '貝克街221B' ==> '貝克街'

+1

是否需要在國際環境下工作?或者美國的街道名稱包含數字? 有足夠的城市與「第23街」。 – MSalters 2009-06-18 14:28:23

回答

2

,直到達到一個字母這將在字符串的前飾條東西:

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

如果它可能有一些像「221B貝克街」,那麼你必須使用更復雜的東西。這應該工作:

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

不錯,但是謝謝 – kenny 2009-06-18 14:28:03

2

組匹配:

.*\d\s(.*) 

如果您還需要考慮到公寓號碼:

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

這將需要123A街道名稱的保健

這應該在前面(和空間)剝去數字,所以只要有字符串中沒有其他數字。只需捕獲第一組(。*)

+0

123 2nd ST是個問題。 – kenny 2009-06-18 14:40:52

0

/[^\d]+$/也將匹配相同的東西,除非不使用捕獲組。

1

街道名稱也可以是數字嗎?例如。

1234 45TH ST 

甚至

1234 45 ST 

您可以處理上述第一種情況,但第二個是困難的。

我會拆分空間上的地址,跳過任何不包含字母的前導組件,然後加入餘數。我不知道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

哎唷!解析一個地址本身可能是非常討厭的,除非你使用標準化的地址。這樣做的原因是,「主號碼」,這通常被稱爲房屋號碼可以在字符串內的各個位置,例如:

  1. RR 2框15(RR也可以是鄉村路線,HC,HCR等)
  2. 郵政信箱17
  3. 12B-7A
  4. NW95E235

這不是一個簡單的undertacking。根據您的應用程序的需求,您最好打算準確信息是利用地址驗證Web服務。有少數提供此功能的提供商。

爲了充分披露,我是SmartyStreets的創始人。我們有一個address verification web service API將驗證和標準化您的地址,以確保它是真實的,並讓您獲得主/房號部分。歡迎您親自與我聯繫並提出問題。