2016-05-23 76 views
1

嘗試從地址中識別(和刪除)街道後綴(如「St」,「Dr」等...)。假設後綴是統一的,我們可以創建一個完整的列表。從地址中刪除街道後綴

謝謝!

street_suffix_list = ["St", "Dr", "Ave", "Blvd", "Tr"] 
address = "105 Main St" 

#returns "Main St" 
street = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '') 

#desired: "St" 
street_suffix = 

#desired: "Main" 
street_name = 
+0

你忘了寫一個問題。 –

回答

2

你只需要從後綴與Regexp分開街道:

street_suffix_list = ["St", "Dr", "Ave", "Blvd", "Tr"] 
address = "105 Main St" 

idx = /(#{street_suffix_list.join('|')})\z/ =~ address 
# $1 => St 
sfx = $1 
street = address[0..idx-1].strip 
# street => "105 Main" 

這是更好地使用安全連接的後綴數組法Regexp::union法(感謝名單@Jordan):

idx = /\b(#{Regexp.union(street_suffix_list)})\z/ =~ address  
+0

你確定所有的單詞都應該在字符串的末尾嗎? –

+0

@WiktorStribiżew因爲他說它是*後綴*,是 –

+0

是的,但後綴不是結尾。這就是爲什麼我認爲文字邊界可能更適合。 –

3

使用「的StreetAddress」的寶石,你可以解析任何地址和地址的 提取物成分。

gem install StreetAddress 
irb 
1.9.3-p551 :002 > require 'street_address' 
=> true 
1.9.3-p551 :003 > address = StreetAddress::US.parse("1600 Pennsylvania Ave, Washington, DC, 20500") 
=> 1600 Pennsylvania Ave, Washington, DC 20500 
1.9.3-p551 :004 > address.street 
=> "Pennsylvania" 
1.9.3-p551 :005 > 
+0

你還可以得到那個寶石的'Ave'嗎? –

+0

我沒有深入到文檔,但我的想法是減去街道()獲得「大道」 – oystersauce8

+0

只是試圖沒有寶石第一,但如果有問題,我可能會訴諸這一點。 – nonegiven72

2

您可以建立交替動態正則表達式(也末匹配可選點,以去除標點符號,同樣,如果存在的話):

/\b(?:St|Dr|Ave|Blvd|Tr)\b\.*/ 

this regex demo

這裏樣品Ruby code

street_suffix_list = ["St", "Dr", "Ave", "Blvd", "Tr"] 
address = "105 Main St" 
puts address.gsub(/\b(?:#{street_suffix_list.join("|")})\b\.*/, "").strip 
# => 105 Main 

請注意,如果沒有文字界限,您將刪除Tr中的Transylvania等。

0

如果您知道後綴的位置將是字符串中的最後一個單詞,那麼您不需要正則表達式來執行此操作:

2.3.0 :017 > suffixes = %w(st ave dr rd blvd) 
=> ["st", "ave", "dr", "rd", "blvd"] 
2.3.0 :018 > address = '105 Main St' 
=> "105 Main St" 
2.3.0 :019 > tokens = address.split 
=> ["105", "Main", "St"] 
2.3.0 :021 > found_match = suffixes.include?(tokens.last.downcase) 
=> true 
2.3.0 :028 > if found_match 
2.3.0 :029?> street_suffix = tokens.last 
2.3.0 :030?> street_rest = tokens[0..-2] 
2.3.0 :031?> # ... 
2.3.0 :032 >  puts street_suffix; puts street_rest.join(' ') 
2.3.0 :033?> end 
St 
105 Main 
=> nil 

這就是說,你將很難解釋地址可以包含的所有變化。我強烈建議使用這個寶石,可能是@ oystersauce8提到的StreetAddress寶石。