【问题标题】:String to Hash conversion字符串到哈希的转换
【发布时间】:2012-05-02 08:50:22
【问题描述】:

我如何将字符串转换为哈希?

现在我用:

eval "{'1627207:28320'=>'text'}"
=> {'1627207:28320'=>'text'}

但“eval”不适合我的情况 - 从参数传递的字符串,这种情况下它不安全

已编辑:

传递的字符串也可以是:

"{'1627207'=>'text', '11:167:28320'=>'text 1 / text 2 / unicode=>привет!'}"

然后需要结果哈希:

{'1627207:28320'=>'text',
'11:167:28320'=>'text 1 / text 2 / unicode=>привет!'}

【问题讨论】:

  • 我想真正的问题是,您为什么要让您的用户将 Ruby 代码传递给您的应用程序?为什么不是可以安全解析的格式,比如 JSON?

标签: ruby string hash


【解决方案1】:
str = "{'1627207:28320'=>'text'}"
p Hash[*str.delete("{}'").split('=>')] #{"1627207:28320"=>"text"}

编辑不同的输入:

str = "{'1627207:28320'=>'text', 'key2'=>'text2'}" 
p Hash[*str.delete("{}'").split(/=>|, /)] #{"1627207:28320"=>"text", "key2"=>"text2"}

【讨论】:

  • 没问题,但用户可以传递 "{'1627207:28320'=>'text', 'key2'=>'text2'}" 字符串。然后报错:ArgumentError: odd number of arguments for Hash from (irb):in []'
【解决方案2】:
class String
  def to_h
    h={}
    self.scan(/'(\w+.\w+)'=>'(\w+)'/).each { |k,v| h[k]=v }
    h
  end
end

p "{'1627207:28320'=>'text','test'=>'text2'}".to_h
=>{"1627207:28320"=>"text", "test"=>"text2"}

编辑:更短的版本

class String
  def to_h
    Hash[self.scan(/'([^']+)'=>'([^']+)'/)]
  end
end

【讨论】:

  • 工作于:"{'key'=>'texttext' }",但不适用于"{'key'=>'text text' }"
  • 好吧,正则表达式需要面向需要处理的输入类型,调整较短的版本以查找 char ' 作为分隔符
【解决方案3】:

很简单:

$ irb
irb(main):001:0> k='1627207:28320'
=> "1627207:28320"
irb(main):002:0> v='text'
=> "text"
irb(main):003:0> h={k => v}
=> {"1627207:28320"=>"text"}
irb(main):004:0> h
=> {"1627207:28320"=>"text"}
irb(main):005:0>

【讨论】:

  • 但是你不解析字符串,只是从变量创建一个哈希
  • 他做了什么样的解析?在他的例子中,他从文本到哈希。如果他得到一个看起来像哈希的字符串,那么正如 Grzegorz 指出的那样,解析是必要的
  • 他得到"{'some_key' => 'value'}"字符串,但也可以得到"{'first' => 1, 'second' => 2}",因为两个字符串都包含哈希。所以他需要一个可以将所有字符串转换为哈希的代码
  • 这种情况下需要解析,或许他可以使用JSON.decode()
  • 解析是插入字符串内容所必需的。即使您使用 eval、JSON 或其他库,它们也会做同样的事情。
【解决方案4】:

你可以试试这个:

text_hash['1627207:28320'] = 'text'
text_hash

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多