从地址中删除街道后缀

时间:2016-05-23 11:50:59

标签: ruby regex

尝试从地址中识别(和删除)街道后缀(如“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 = 

4 个答案:

答案 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 > 

答案 1 :(得分: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和类似内容。

答案 2 :(得分: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方法的后缀数组的安全连接方法(thanx @Jordan):

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

答案 3 :(得分: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宝石。