这是我的代码:
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"}
这是我的代码:
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"}
#!/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 = "special_filter,|filter_str,(&(a=1)(c=11)(p=c=11,o=m,d=4))"
第 2 行:设置一个变量 hash,用一个空的 hash 来填充。
hash = {}
第 3 行:
string.slice(/\(&.*\)/) => "(&(a=1)(c=11)(p=c=11,o=m,d=4))"
正则表达式以正斜杠结尾(/regexp 位于此处/)。括号在正则表达式中具有特殊含义,因此必须使用反斜杠对其进行转义。& 匹配字符串中的 &。在正则表达式中,一个 . 表示任何字符。* 表示没有或无限的前面的字符。所以这个正则表达式匹配 (&) 以及 (&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 }
我的尝试。
Hash[*string[/\&.*/].tr("&(","").split(")").map{|i| i.split("=",2)}.flatten]
来自@Conner 的解决方案的一些想法;)
谢谢@corner,我能够知道一些我以前从未使用过的功能。