2009-10-31 163 views
0

我有嵌套組這樣 一個字符串(「布拉布拉」是字符串中的一些文字,必須被忽略)解析嵌套組

string Stream1 = @"group ""Main"" 
          bla 
          bla 
           group ""Sub1"" -- block-group 
           var1 
           var2 
           endgroup -- block-group ""Sub1"" 
           bla 
           bla 
           group ""Sub2"" -- block-group 
           var1 
           endgroup -- block-group ""Sub2"" 
           bla 
           group ""Sub3"" -- block-group 
           var1 
           var2 
           var3 
            group ""SubSub31"" -- block-group 
            var10 
            var20 
            endgroup -- block-group ""SubSub31"" 
           endgroup -- block-group ""Sub3"" 
          endgroup"; 

的預期結果是這樣的

GroupObjects列表
public class GroupObject 
    {  
     public string GroupName = ""; // Example: SubSub31 
     public string GroupPath = ""; // Example: Main/Sub3/SubSub31 
     public List<Var> LocalVar = new List<VarBloc();//Var10,var20 
    } 

我想一些遞歸正則表達式將解決這個問題,但我無法弄清楚如何做到這一點。

有人可以給我一個提示嗎?

示例代碼將高度讚賞

回答

0

遞歸正則表達式可能解決這個問題 - 但複雜性也可能過高很容易地維護(和我說話的人誰一旦實施和銷售的常規表達式引擎)。

我是不是會給你一個完整的解決方案 - 但這裏有一種方法來解決問題。

你的輸出對象需要改變,以允許嵌套組,這樣的事情:

public class Group 
{  
    public string Name { get; set; } 
    public string GroupPath { get; set; } 
    public IEnumerable<VarBlock> Variables { get; } 
    public IEnumerable<Group> NestedGroups { get; } 
} 

(注意使用性質的,而不是公衆成員)假設你輸入流

是基於線格式,創建將所述字符串轉換成線的函數:

public Queue<string> GetLines(string definition) { ... } 

然後,創建一個例程解析的基團:

public Group ParseGroup(Queue<string> lines) { ... } 
  • 當本程序遇到一個組的開始,它應該遞歸調用自身來解析嵌套組,然後將結果添加到NestedGroups
  • 當這個例程遇到一個組的結束時,它應該完成組裝塊並返回對象。

希望這會對您有所幫助。

+0

謝謝。我會嘗試 – tomfox66 2009-11-01 13:25:35

0

我推薦ANTLR(http://www.antlr.org/),它是爲解析各種半結構化文檔而開發的。有一本書(The Antinitive ANTLR Reference)將讓你脫穎而出。它能夠爲諸如Java和C#等語言提供完整的解析器。您可以在解析器中包含(Java)代碼,這將允許您將結果處理成您需要的數據結構。