嘿,我需要弄清楚如何转动这个字符串
"?q=cat&name=Tim#img=FunnyCat"
进入哈希
({"q" => "cat", "name" => "Tim"})
我非常关注这个问题,我们将非常感谢任何协助。
答案 0 :(得分:3)
如果你剥离?
部分并在#
之后修剪,那么你会得到这个:
require 'cgi'
CGI.parse("q=cat&name=Tim")
# => {"q"=>["cat"], "name"=>["Tim"]}
所以预处理:
query = query.sub(/\A\?/, '').sub(/\#.*/, '')
答案 1 :(得分:2)
我建议您使用URI.parse
和CGI.parse
。 URI.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
有帮助的情况。