在Ruby中散列字符串

时间:2017-07-16 20:53:38

标签: ruby string hash

嘿,我需要弄清楚如何转动这个字符串

"?q=cat&name=Tim#img=FunnyCat"

进入哈希

({"q" => "cat", "name" => "Tim"})

我非常关注这个问题,我们将非常感谢任何协助。

4 个答案:

答案 0 :(得分:3)

如果你剥离?部分并在#之后修剪,那么你会得到这个:

require 'cgi'

CGI.parse("q=cat&name=Tim")
# => {"q"=>["cat"], "name"=>["Tim"]}

所以预处理:

query = query.sub(/\A\?/, '').sub(/\#.*/, '')

答案 1 :(得分:2)

我建议您使用URI.parseCGI.parseURI.parse将帮助您轻松获得查询,而CGI.parse将完成解析查询并将其转换为哈希的实际工作。

require 'uri'
require 'cgi'

CGI.parse(URI.parse('?q=cat&name=Tim#img=FunnyCat').query)

这将返回{"q"=>["cat"], "name"=>["Tim"]}

答案 2 :(得分:0)

您应该使用库,但无论如何这里都是正则表达式解决方案:

str = "?q=cat&name=Tim#img=FunnyCat"

r1 = /(?<=\?).+?(?=#)/
r2 = /&|=/

str[r1].split(r2).each_slice(2).to_h 
 #=> {"q"=>"cat", "name"=>"Tim"}

答案 3 :(得分:0)

r = /
    [[:alpha:]]+   # match 1 or more letters
    =              # match '='
    [[:alpha:]]+
    (?=&)          # match '&' in positive lookahead
    |              # or
    (?<=&)         # match '&' in positive lookbehind
    [[:alpha:]]+
    =
    [[:alpha:]]+
    /x             # free-spacing regex definition mode

str = "?q=cat&name=Tim#img=FunnyCat"

str.gsub(r).each_with_object({}) do |s,h|
  k, v = s.split('=')
  h[k] = v
end
  #=> {"q"=>"cat", "name"=>"Tim"}

这使用没有阻塞的String#gsub形式,因此返回一个枚举器。请注意,不执行任何字符替换。我发现了一些以这种方式使用gsub有帮助的情况。