【发布时间】:2017-12-21 08:10:35
【问题描述】:
嘿,我需要弄清楚如何转动这个字符串
"?q=cat&name=Tim#img=FunnyCat"
进入散列
({"q" => "cat", "name" => "Tim"})
我非常坚持这个问题,任何帮助将不胜感激。
【问题讨论】:
-
如果您使用的是 Web 框架,那么您就问错了问题,因为该框架可能会为您执行此操作。
嘿,我需要弄清楚如何转动这个字符串
"?q=cat&name=Tim#img=FunnyCat"
进入散列
({"q" => "cat", "name" => "Tim"})
我非常坚持这个问题,任何帮助将不胜感激。
【问题讨论】:
如果你去掉? 部分并在# 之后修剪,那么你会得到这个:
require 'cgi'
CGI.parse("q=cat&name=Tim")
# => {"q"=>["cat"], "name"=>["Tim"]}
所以预处理:
query = query.sub(/\A\?/, '').sub(/\#.*/, '')
【讨论】:
我建议你使用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"]}
【讨论】:
您应该使用库,但无论如何这里有一个正则表达式解决方案:
str = "?q=cat&name=Tim#img=FunnyCat"
r1 = /(?<=\?).+?(?=#)/
r2 = /&|=/
str[r1].split(r2).each_slice(2).to_h
#=> {"q"=>"cat", "name"=>"Tim"}
【讨论】:
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 很有帮助的情况。
【讨论】: