这是我的代码:
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"}
答案 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行:
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)
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我能够知道以前从未使用过的一些功能。