2013-04-11 18 views
0

我有如下一行字符串:如何掃描單行params字符串並返回兩個數組?

params = {"FieldStructure"=>"{\"Fields\":[{\"Title\":\"Company Name\",\"Type\":\"text\",\"ID\":\"Field6\"},{\"Title\":\"Email\",\"Type\":\"email\",\"ID\":\"Field5\"}]}", "Field6"=>"tettetette", "Field5"=>"[email protected]", "EntryId"=>"25"} 

格式化版本:

params = { 
    "FieldStructure"=>" 
    {\"Fields\":[ 
     {\"Title\":\"Company Name\",\"Type\":\"text\",\"ID\":\"Field6\"}, 
     {\"Title\":\"Email\",\"Type\":\"email\",\"ID\":\"Field5\"}]}", 
    "Field6"=>"tettetette", 
    "Field5"=>"[email protected]", 
    "EntryId"=>"25" 
} 

我希望收到:[["Company Name", "Field6"], ["Email", "Field5"]]

我試圖用掃描的方法,但有一些問題:

>> fields = params['FieldStructure'].scan(/Title\":\"(.+?)\".+ID\":\"(.+?)\"/) 
=> [["Company Name", "Field5"]] 

如何達到t他?

+0

有什麼理由不把它當作JSON有效載荷? FieldStructure是一個格式良好的json字符串。 – 2013-04-11 12:01:39

回答

1

非正則表達式的解決方案:

require 'json' 
params = {"FieldStructure"=>"{\"Fields\":[{\"Title\":\"Company Name\",\"Type\":\"text\",\"ID\":\"Field6\"},{\"Title\":\"Email\",\"Type\":\"email\",\"ID\":\"Field5\"}]}", "Field6"=>"tettetette", "Field5"=>"[email protected]", "EntryId"=>"25"} 

a = JSON.parse(params["FieldStructure"]) 
out = a["Fields"].map {|a| [a["Title"],a["ID"]]} 
p out # [["Company Name", "Field6"], ["Email", "Field5"]] 
1

正確的方法是:

params['FieldStructure'].scan(/Title\":\"(.+?)\".+?ID\":\"(.+?)\"/) 

你+前ID是greddy,這意味着它會消耗最多字符它能直到找到下一個ID。該?最後它變得不可靠。