我有字符串,我必须将其转换为哈希,如2号

时间:2012-07-09 07:57:25

标签: ruby-on-rails

这是我的代码:

 1. "special_filter,|filter_str,(&(a=1)(c=11)(p=c=11,o=m,d=4))"


 2.{ "a" =>"1", "c" => "11" , "p" => "c=11,o=m,d=4"}

2 个答案:

答案 0 :(得分:2)

#!/usr/bin/ruby

string = "special_filter,|filter_str,(&(a=1)(c=11)(p=c=11,o=m,d=4))"
hash = {}
string.slice(/\(&.*\)/).split(")").each do |match|
  match.tr("(&","").split("=",2).each_slice(2) { |key, value| hash[key] = value }
end

逐行:

第1行:使用起始字符串设置变量string。

string = "special_filter,|filter_str,(&(a=1)(c=11)(p=c=11,o=m,d=4))"

第2行:设置一个变量hash,并使用空哈希来填充。

hash = {}

第3行:

  • 剪切与此regexp匹配的字符串部分

string.slice(/\(&.*\)/) => "(&(a=1)(c=11)(p=c=11,o=m,d=4))"

  

正则表达式用正斜杠(/ regexp到此处/)预订。   括号在正则表达式中具有特殊含义,因此它们必须使用反斜杠进行转义。   &匹配&在字符串中。   在正则表达式中,a。意味着任何角色。   *表示无前提字符的无限制。   所以这个正则表达式匹配(&)以及(& fjalsdkfj)。

  • 用右括号分割字符串

string.slice(/\(&.*\)/).split(")") => ["(&(a=1", "(c=11", "(p=c=11,o=m,d=4"]

  • 然后遍历结果数组

string.slice(/\(&.*\)/).split(")").each do |match|

第4行:

  • 进行迭代并从中删除不需要的字符

match.tr("(&","")

  • 使用第一个=符号
  • 拆分一次

match.tr("(&","").split("=",2)

  • 使用2值数组作为哈希
  • 上的键和值

match.tr("(&","").split("=",2).each_slice(2) { |key, value| hash[key] = value }

答案 1 :(得分:1)

我尝试这个。

Hash[*string[/\&.*/].tr("&(","").split(")").map{|i| i.split("=",2)}.flatten]

从@ Conner的解决方案中获得的一些想法;)

谢谢@corner我能够知道以前从未使用过的一些功能。