【发布时间】:2016-05-21 02:51:50
【问题描述】:
因此,使用良好的 'ol string.split,根据分隔符拆分字符串很容易。现在假设我想拆分一个开放的大括号和一个封闭的大括号。也很简单:
var foo = "{foo}{bar}";
var splitme = foo.Split(new char[] { '{', '}'});
现在让我们通过在初始打开/关闭 { } 中添加嵌套 { } 使其更复杂,最多 n 级。我想要解析一个看起来像是游戏模组(恒星,伟大的游戏)的专有文本文件格式,我正在寻找一种解析这个东西的好方法。我将如何保存文本中括号(标记化?)片段的每个部分?此外,还保留了使用 = 作为关系指示符的键值对类型的业务。
这是我尝试以这种方式解析的示例:
#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 逐行阅读这个坏男孩,并跟踪我遇到了多少 { 在他们开始用相应的 } 关闭之前。在 {} 的每个块中,我都会找到那个 =,然后找出我刚刚找到的键值对,以及它在层次结构中的位置。这……似乎不太理想。有没有更好的正则表达式魔法或现成的文本解析库?
【问题讨论】:
-
使用像ANTLR这样的词法分析器