【问题标题】:Hashing a string in Ruby在 Ruby 中散列一个字符串
【发布时间】:2017-12-21 08:10:35
【问题描述】:

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

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

进入散列

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

我非常坚持这个问题,任何帮助将不胜感激。

【问题讨论】:

  • 如果您使用的是 Web 框架,那么您就问错了问题,因为该框架可能会为您执行此操作。

标签: ruby string hash


【解决方案1】:

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

require 'cgi'

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

所以预处理:

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

【讨论】:

    【解决方案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"]}

    【讨论】:

      【解决方案3】:

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

      str = "?q=cat&name=Tim#img=FunnyCat"
      
      r1 = /(?<=\?).+?(?=#)/
      r2 = /&|=/
      
      str[r1].split(r2).each_slice(2).to_h 
       #=> {"q"=>"cat", "name"=>"Tim"}
      

      【讨论】:

        【解决方案4】:
        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 很有帮助的情况。

        【讨论】:

          猜你喜欢
          • 2022-01-16
          • 2012-01-10
          • 2015-12-14
          • 2023-03-31
          • 2023-03-15
          • 2020-07-07
          • 2019-10-28
          • 2023-03-07
          • 2011-09-30
          相关资源
          最近更新 更多