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行ずつ:

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はここにあります/)。括弧は正規表現で特別な意味を持つため、円記号でエスケープする必要があります。&は文字列の&と一致します。正規表現では、。任意の文字を意味します。*は、前の文字がないか無制限であることを意味します。したがって、この正規表現は(&)および(&fjalsdkfj)と一致します。

  • 文字列を右括弧で分割します

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

  • 次に、結果の配列を繰り返し処理します

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

4行目:

  • 反復を取り、不要な文字を削除します

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

  • =最初の記号を使用して、1回分割します

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 に答える