Stu*_*t C 7 ruby regex parsing ruby-on-rails
我正在将地址处理为它们各自的数据库字段格式.我可以得到房屋号码和街道类型,但试图确定最好的方法来获得没有数字和最后一个字的街道.收到的标准街道地址是:
res[:address] = '7707 Foo Bar Blvd'
Run Code Online (Sandbox Code Playgroud)
截至目前,我可以解析以下内容:
house = res[:address].gsub(/\D/, '')
street_type = res[:address].split(/\s+/).last
Run Code Online (Sandbox Code Playgroud)
我的第一个挑战是如何获得'Foo Bar'.请注意,街道名称可以是一个,两个或三个单词.我很难在Ruby中为此找到一个单行表达式解决方案.
我的第二个问题是如何改进"房子"代码来处理最后有alpha的门牌号码.例如,"7707B".
最后,如果您可以参考一个好的备忘单,其中包含有助于这些表达的示例.
Stu*_*t M 11
如果可能的话,我建议使用一个库,因为地址解析可能很困难.查看Indirizzo Ruby宝石,简化:
require 'Indirizzo'
address = Indirizzo::Address.new("7707 Foo Bar Blvd")
address.number
=> "7707"
address.street
=> ["foo bar blvd", "foo bar boulevard"]
Run Code Online (Sandbox Code Playgroud)
即使您不使用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/
}
Run Code Online (Sandbox Code Playgroud)
源代码中的这些文件可以提供更多细节:
(但我也普遍同意@ drhenner的评论,为了让你自己更容易,你可能只是在不同的领域接受这些数据输入.)
编辑:要提供有关如何删除街道后缀(例如"Blvd")的更具体的答案,您可以使用Indirizzo的正则表达式常量(例如Suffix_Typefrom constants.rb),如下所示:
address = Indirizzo::Address.new("7707 Foo Bar Blvd", :expand_streets => false)
address.street.map {|street| street.gsub(Indirizzo::Suffix_Type.regexp, '').strip }
=> ["foo bar"]
Run Code Online (Sandbox Code Playgroud)
(注意我也传递:expand_streets => false给初始化程序,以避免扩展"Blvd"和"Boulevard"替代方案,因为我们无论如何都要丢弃后缀.)
| 归档时间: |
|
| 查看次数: |
5656 次 |
| 最近记录: |