加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Ruby中解析街道地址

发布时间:2020-12-17 04:31:20 所属栏目:百科 来源:网络整理
导读:我正在将地址处理为它们各自的数据库字段格式.我可以得到房屋号码和街道类型,但试图确定最好的方法来获得没有数字和最后一个字的街道.收到的标准街道地址是: res[:address] = '7707 Foo Bar Blvd' 截至目前,我可以解析以下内容: house = res[:address].gsu
我正在将地址处理为它们各自的数据库字段格式.我可以得到房屋号码和街道类型,但试图确定最好的方法来获得没有数字和最后一个字的街道.收到的标准街道地址是:
res[:address] = '7707 Foo Bar Blvd'

截至目前,我可以解析以下内容:

house = res[:address].gsub(/D/,'')
    street_type = res[:address].split(/s+/).last

我的第一个挑战是如何获得’Foo Bar’.请注意,街道名称可以是一个,两个或三个单词.我正在努力为Ruby找到一个单行表达式解决方案.

我的第二个问题是如何改进“房子”代码来处理最后有alpha的门牌号码.例如,“7707B”.

最后,如果您可以参考一个好的备忘单,其中包含有助于这些表达的示例.

解决方法

如果可能的话,我建议使用一个库,因为地址解析可能很困难.查看 Indirizzo Ruby gem,这样可以轻松实现:
require 'Indirizzo'
address = Indirizzo::Address.new("7707 Foo Bar Blvd")
address.number
 => "7707"
address.street
 => ["foo bar blvd","foo bar boulevard"]

即使您不使用Indirizzo库本身,阅读其源代码可能非常有用,看看他们如何解决问题.例如,它精确调整了正则表达式以匹配地址的不同部分:

Match = {
  # FIXME: shouldn't have to anchor :number and :zip at start/end
  :number   => /^(d+W|[a-z]+)?(d+)([a-z]?)b/io,:street   => /(?:b(?:d+w*|[a-z'-]+)s*)+/io,:city     => /(?:b[a-z][a-z'-]+s*)+/io,:state    => State.regexp,:zip      => /b(d{5})(?:-(d{4}))?b/o,:at       => /s(at|@|and|&)s/io,:po_box => /b[P|p]*(OST|ost)*.*s*[O|o|0]*(ffice|FFICE)*.*s*[B|b][O|o|0][X|x]b/
}

源代码中的这些文件可以提供更多细节:

> https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/address.rb
> https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/constants.rb
> https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/numbers.rb

(但我也普遍同意@ drhenner的评论,为了让你自己更容易,你可能只是在不同的领域接受这些数据输入.)

编辑:要提供有关如何删除街道后缀(例如“Blvd”)的更具体的答案,您可以使用Indirizzo的正则表达式常量(例如来自constants.rb的Suffix_Type),如下所示:

address = Indirizzo::Address.new("7707 Foo Bar Blvd",:expand_streets => false)
address.street.map {|street| street.gsub(Indirizzo::Suffix_Type.regexp,'').strip }
 => ["foo bar"]

(注意我也传递了:expand_streets => false到初始化程序,以避免同时扩展“Blvd”和“Boulevard”替代方案,因为我们无论如何都要丢弃后缀.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读