2013-01-07 61 views
0

我需要帮助了解将复杂字符串解析为Tree数据结构的最简单方法。 我想弄清楚如何解析这个字符串使用C#。如何将复杂字符串解析为数据结构

下面是此字符串的一个例子:

[[Le[[filet|tartare]]|La grillade]]de gateau|Une [[portion|part]] de gateau 

[...]是一家集和|是集分离

例如,我会再需要获得

Set 1 
     Set 1-1 
      Le 
      Set 1-1-1 
       filet 
       tartare 
      La grillade 
    Set 2 
     Une 
     Set 2-1 
      portion 
      part 
     de gateau 
+1

为什么'德gateau'谈到下集2,以后的Une''... ? – nhahtdh

+1

http://en.wikipedia.org/wiki/Finite-state_machine –

+0

@nhahtdh - 它是在顶级设置的第二个高级别分隔符之后。 – Oded

回答

0
using System; 
using System.Collections.Generic; 
using System.IO; 

class Tree 
{ 
    int currentIndent; 

    public Tree(string s) 
    { 
     this.Trees = new List<Tree>(); 
     this.Values = new List<string>(); 
     this.currentIndent = 0; 

     if (s == null) 
      throw new ArgumentNullException(); 

     if (s == "") 
      return; 

     int beginPos = 0; 
     while (beginPos < s.Length) 
     { 
      if (s[beginPos] == '[') 
      { 
       string res = ""; 
       uint openedBraceCount = 1; 
       uint closedBraceCount = 0; 
       int index = beginPos + 1; 
       while (openedBraceCount != closedBraceCount) 
       { 
        if (s[index] == '[') 
         openedBraceCount++; 
        if (s[index] == ']') 
         closedBraceCount++; 
        res += s[index]; 
        index++; 
       } 
       beginPos = index; 
       this.Trees.Add(new Tree(res.Substring(0, res.Length - 1))); 
      } 
      else 
      { 
       int endPos = beginPos + 1; 
       while (endPos < s.Length && s[endPos] != '[') 
        endPos++; 
       string[] values = s.Substring(beginPos, endPos - beginPos).Split('|'); 
       for (int i = 0; i < values.Length; i++) 
        values[i] = values[i].Trim(); 
       this.Values.AddRange(values); 
       beginPos = endPos; 
      } 
     } 
    } 

    public void Print(TextWriter writer, int indent) 
    { 
     this.currentIndent = indent; 
     Print(writer, 0, this); 
     this.currentIndent = 0; 
    } 

    private void Print(TextWriter writer, int indent, Tree tree) 
    { 
     foreach (string value in tree.Values) 
      writer.WriteLine("{0}{1}", new string(' ', indent), value); 
     foreach (Tree t in tree.Trees) 
      Print(writer, currentIndent + indent, t); 
    } 

    public List<Tree> Trees { get; set; } 

    public List<string> Values { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "[[Le[[filet|tartare]]|La grillade]]de gateau|Une [[portion|part]] de gateau"; 
     var tree = new Tree(s); 
     tree.Print(Console.Out, 2); 
    } 
}