解析嵌套组

时间:2009-10-31 22:19:22

标签: c# .net

我有一个像这样的嵌套组的字符串 ('blabla'是字符串中必须忽略的一些文本)

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
    }

我猜一些递归正则表达式会解决这个问题,但我无法弄清楚如何做到这一点。

有人可以给我一个提示吗?

示例代码将受到高度赞赏

2 个答案:

答案 0 :(得分: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
  • 当这个例程遇到一个组的结束时,它应该完成组装块,并返回该对象。

希望这有用。

答案 1 :(得分:0)

我推荐ANTLR(http://www.antlr.org/),它是为解析各种半结构化文档而开发的。有一本书(The Definitive ANTLR Reference)可以帮助您实现目标。它能够为Java和C#等语言提供完整的解析器。您可以在解析器中包含(Java)代码,以便您使用 将结果处理到您需要的数据结构中。