因此,使用良好的string.split很容易将基于分隔符的字符串拆分。现在让我们说我想分开一个开放的花括号和一个封闭的花括号。同样简单明了:
var foo = "{foo}{bar}";
var splitme = foo.Split(new char[] { '{', '}'});
现在让我们通过在初始打开/关闭{}内添加嵌套{}来使其变得更复杂,最多可达n级。我之后试图解析游戏模式的专有文本文件格式(stellaris,伟大的游戏),我正在寻找一种解析这个东西的好方法。我将如何保留文本中被包围的(标记化的?)片段的每一部分?添加到混合中是使用=作为关系的指示符来保留关键值对业务。
以下是我尝试以这种方式解析的一个例子:
#Neutronium Materials
tech_ship_armor_5 = {
area = engineering
cost = @tier3cost4
tier = 3
category = { materials }
ai_update_type = military
prerequisites = { "tech_ship_armor_4" "tech_mine_neutronium" }
weight = @tier3weight4
weight_modifier = {
factor = 1.25
modifier = {
factor = 1.25
research_leader = {
area = engineering
has_trait = "leader_trait_expertise_materials"
}
}
}
ai_weight = {
modifier = {
factor = 1.25
research_leader = {
area = engineering
has_trait = "leader_trait_expertise_materials"
}
}
}
}
我的第一个方法是逐行读取这个坏孩子的StreamReader,并跟踪在我们开始用相应的关闭之前遇到的问题。在{}的每个块中,我追捕那个=然后找出我刚刚找到的键值对,以及它在层次结构中的位置。这......似乎并不理想。使用一些正则表达式魔法或现成的文本解析库有更好的方法吗?
答案 0 :(得分:1)
我的第一个想法是查看JSON解析器,看看它是如何在那里完成的。
您的示例看起来最好通过递归解析:例如,将tech_ship_armor_5
视为对象,获取其开始标记,验证其结束标记的存在并从那里开始。
那么您就拥有tech_ship_armor_5.area
属性,其值为engineering
; category
属性的值将是另一个具有自己属性的对象materials
。
是的,类似JSON的解析就是这样的。