2012-02-10 76 views
1

拆分JSON一樣串我想通過使用正則表達式表達由正則表達式表達

Country:Subdivision, Level1:{Level2a:{Level3a, Level3b}, Level2b} 

Country 
    Subdivision 
Level1 
    Level2a 
     Level3a 
     Level3b 
    Level2b 

形式下面分割字符串我知道有將是一個遞歸函數來拆分字符串轉換成上述形式。

我使用.NET,並希望如下分割字符串成一個類

public class ListHierarchy 
{ 
    public string Name { get; set; } 
    public ListHierarchy ParentListHierarchy { get; set; } 
} 

概念(輸出):

var list1 = new ListHierarchy() { Name = "Country" }; 
var list2 = new ListHierarchy() { Name = "Subdivision", ParentListHierarchy = list1 }; 
var list3 = new ListHierarchy() { Name = "Level1" }; 
var list4 = new ListHierarchy() { Name = "Level2a", ParentListHierarchy = list3 }; 
var list5 = new ListHierarchy() { Name = "Level2b", ParentListHierarchy = list3 }; 
var list6 = new ListHierarchy() { Name = "Level3a", ParentListHierarchy = list4 }; 
var list7 = new ListHierarchy() { Name = "Level3b", ParentListHierarchy = list4 }; 

夥計們,我得已解決,但仍需要進行微調的正則表達式

public static Dictionary<string, string> SplitToDictionary(string input, string regexString) 
{ 
    Regex regex = new Regex(regexString); 
    return regex.Matches(input).Cast<Match>().ToDictionary(x => x.Groups[1].Value.Trim(), x => x.Groups[2].Value.Trim()); 
} 

string input = "Country:Subdivision, Level1:{Level2a:{Level3a:Level4a, Level3b}, Level2b}"; 

var listHierarchy = new List<ListHierarchy>(); 
Dictionary<string, string> listParent = SplitToDictionary(input, @"([\w\s]+):(([\w\s]+)|([\w\s\,\{\}\:]+))"); 

但是,我越來越

{Level2a:{Level3a, Level3b}, Level2b} 

而不是

Level2a:{Level3a, Level3b}, Level2b 
+3

相信我,你不想爲此使用正則表達式。你想要一個JSON解析器。我很確定你使用的語言(你沒有指定)已經有一個。 – 2012-02-10 07:56:36

+1

實際上,因爲這不是有效的JSON,所以你不需要JSON解析器,但是你需要一個[遞歸下降解析器](http://en.wikipedia.org/wiki/Recursive_descent_parser)。 – 2012-02-10 08:06:53

+0

我創建了一個字符串來存儲我的動態層次結構列表,併爲我的字符串設計選擇了json格式。它不是JSON,而是JSON類似的字符串。 – agent99 2012-02-10 08:09:25

回答

-2

你可以使用這個表達式

([^\s,:{}])+ 

這將讓你的國家1級細分Level2a Level3a Level3b Level2b。 你將不得不把它放入一個數組,然後根據你的風格推出它。

編輯

這將積極破壞JSON層次因此不推薦用於這個問題/情形。這隻會返回可以存儲在數組中的字符串。

+1

-1:除了它不起作用的事實,他應該如何猜測縮進/縮進的位置? – 2012-02-10 07:57:55

+0

他要求獲得字符串的正則表達式,所以這就是我的建議。因爲我不知道他將使用哪種語言,所以我沒有說他將如何進行縮進/縮進。你甚至讀過那部分我說過OP的風格是由他決定的嗎?那麼爲什麼-1? – XepterX 2012-02-10 08:00:17

+2

通過使用正則表達式,您可以主動*銷燬*縮進/縮進所需的信息。 – 2012-02-10 08:01:37

0

我喜歡正則表達式,但對於這個問題他們只是不正確的工具。

Irony是一個非常好用且非常易於使用的庫,它可以讓你爲你的類似json的東西編寫一個解析器。

它是免費的,開源的,這些例子包括一個json解析器,你可以適應你的需求。