如何转换这种类似哈希的'字符串到键值对

时间:2016-05-03 15:23:19

标签: ruby

我使用Ruby 2.2并且有一个如下所示的字符串:

myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'

如何将其转换为键值对和/或某种哈希值?当我myvar['myval1']时,我会回来'myval1',这不是我之后的事情。答案可能正好盯着我,但到目前为止还没有任何工作。

2 个答案:

答案 0 :(得分:3)

正如我多次看到的那样 - 简单地提及eval会让人立即感到不安,即使这是一个正确的用例(事实并非如此)。

所以我将使用另一个讨厌的磁铁 - 用正则表达式解析嵌套结构。

迭代(1) - 一种天真的方法:

JSON.parse(myvar.gsub(/=>/, ':'))

问题 - 如果字符串键/值包含=>,则会弄乱您的数据。

迭代(2) - 偶数个"表示你不在字符串中:

JSON.parse(myvar.gsub(/=>(?=(?:[^"]*"){2}*[^"]*$)/, ':'))

问题 - 字符串中可能有一个",用斜杠进行转义。

迭代(3) - 类似迭代(2),但只计算前面有非转义斜杠的"。未转义的斜杠将是一系列奇数斜线:

eq_gt_finder = /(?<non_quote>
                  (?:
                     [^"\\]|
                     \\{2}*\\.
                  )*
                ){0}
                =>(?=
                     (?:
                        \g<non_quote>
                        "
                        \g<non_quote>
                     ){2}*
                     $
                  )/x
JSON.parse(myvar.gsub(eq_gt_finder, ':'))

See it in action

问:你是一个绝对可靠的神圣生物,绝对肯定这会在100%的时间内起作用吗?

A:没有。

问:这不是很慢而且不可读吗?

You're god damn right.

问:好吗?

A:是的。

答案 1 :(得分:2)

您可以轻松地将该字符串更改为有效JSON,然后使用JSON.parse

require 'JSON'
myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'

hash = JSON.parse(myvar.gsub(/=>/, ': '))
#=> { "myval1"  => "value1", "mayval2" => "value2" }

hash['myval1']
#=> "value1"