Ruby 从地址中删除街道后缀
试图从地址中识别(并删除)街道后缀(如“St”、“Dr”等)。假设后缀是统一的,我们可以创建一个完整的后缀列表 谢谢Ruby 从地址中删除街道后缀,ruby,regex,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
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 =
使用“streetaddress”gem,您可以解析任何地址和地址 提取地址的组件
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 >
使用“streetaddress”gem,您可以解析任何地址和地址 提取地址的组件
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 >
您可以构建一个带有替换项的动态正则表达式模式(也可以在末尾匹配可选点以删除该标点,如果存在): 看 以下是示例:
请注意,如果没有单词边界,您将删除
Transylvania
中的Tr
和类似内容。您可以构建一个带有替换项的动态正则表达式模式(也可以在末尾匹配可选点以删除该标点,如果存在):
看
以下是示例:
请注意,如果没有单词边界,您将删除
Transylvania
中的Tr
和类似内容。您只需使用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"
后缀数组最好使用安全连接方法和方法(thanx@Jordan):
您只需使用
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"
后缀数组最好使用安全连接方法和方法(thanx@Jordan):
如果知道后缀的位置将是字符串中的最后一个单词,则不需要正则表达式:
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
总而言之,您将很难解释地址可能包含的所有变化。我强烈建议为此使用gem,可能是@oystersauce8提到的
StreetAddress
gem。如果您知道后缀的位置将是字符串中的最后一个单词,则不需要正则表达式:
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
总而言之,您将很难解释地址可能包含的所有变化。我强烈建议使用gem,可能是@oystersauce8提到的
StreetAddress
gem。你确定单词都应该在字符串的末尾吗?@WiktorStribiżew,因为他说它是后缀,是的,但后缀不是结尾。这就是为什么我认为单词边界更合适的原因。@WiktorStribiżew>在语言学中,后缀(有时也称为后缀或结尾)是放在词干后面的词缀@WiktorStribiżew我知道,我是俄罗斯人=)你确定单词都应该在字符串的末尾吗?@WiktorStribiżew,因为他说它是后缀,是的,但后缀不是结尾。这就是为什么我认为单词边界更合适的原因。@WiktorStribiżew>在语言学中,后缀(有时也称为后缀或结尾)是放在词干后面的词缀@WiktorStribiżew我知道,我是俄罗斯人=)你也能用那块宝石得到“Ave”吗?我没有深入阅读文档,但我的想法是减去街道()得到“Ave”,只是想先在没有宝石的情况下得到它,但如果有问题,我可能会求助于此。你能不能也用那块宝石得到“Ave”?我没有深入阅读文档,但我的想法是减去street()得到“Ave”,只是想先在没有宝石的情况下得到它,但如果有问题,我可能会求助于这个。你忘了写问题。你忘了写问题。