0

这是我的代码:

 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"}
4

2 回答 2

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 = "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)

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

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

于 2012-07-09T08:15:36.757 回答
1

我的尝试。

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

来自@Conner 的解决方案的一些想法;)

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

于 2012-07-10T10:03:44.233 回答