0

私が扱っている文字列の例:

s = "{new {value1 value2 value3}} {old {value2 value1 value1}} {{old school} {value2 value3 value1}}"

{} はスペースの影響を受けます。そのため、「古い学校」は囲まれていますが、「新しい」と「古い」は囲まれていません。

s.split[1]最初の 2 つ (新しいものと古いもの) の解析は、 "new" へのアクセスと値の使用を使用して簡単に実行できs.split[3..5]ます。問題は、「new」または「old」にスペースがある場合です。この場合は「old school」です。私がアクセスしているデータベースでは、スペースを含むこれらの名前がランダムに発生します。

これらの発生を考慮して解析を変更するにはどうすればよいですか?

4

2 に答える 2

0

これを正規表現で解析するのではなく、文字ごとに移動して、ブラケット階層内の位置を覚えておく必要があります。

これが私の解決策です:http://pastebin.com/kLLnS5qB

(これは大まかなカットにすぎません。一部の呼び出しは実際には乾燥しておらず、テストが不足しています。)

$ ruby foo.rb 
[#<struct key="new", values=["value1", "value2", "value3"]>, #<struct key="old", values=["value2", "value1", "value1"]>, #<struct key="old school", values=["value2", "value3", "value1"]>]
于 2012-10-05T17:55:52.133 に答える
0

この1行でそれを行うことができます:

s.split("}} {").map{|x| x.split(" {")}.map{|x| x.map{|y| y.gsub("{","").gsub("}","")}}

ちょっと醜いですが、あなたの例で動作し、戻ります:

[["new", "value1 value2 value3"], ["old", "value2 value1 value1"], ["old school", "value2 value3 value1"]]

その後、値を独自のオブジェクトなどに分割することで、さらに解析できます。ハッシュとして使用する場合は、次のように取得できます。

Hash[s.split("}} {").map{|x| x.split(" {")}.map{|x| x.map{|y| y.gsub("{","").gsub("}","")}}]

これは以下を返します:

{"new"=>"value1 value2 value3", "old"=>"value2 value1 value1", "old school"=>"value2 value3 value1"} 
于 2012-10-05T18:13:13.327 に答える