我有一个像这样的嵌套组的字符串 ('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
}
我猜一些递归正则表达式会解决这个问题,但我无法弄清楚如何做到这一点。
有人可以给我一个提示吗?
示例代码将受到高度赞赏
答案 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)代码,以便您使用 将结果处理到您需要的数据结构中。