标记嵌套定界符之间的字符串
tokenizing a string between nested delimiters
因此,使用良好的 'ol string.split,根据定界符拆分字符串很容易。现在假设我想拆分一个开放的大括号和一个封闭的大括号。也很简单:
var foo = "{foo}{bar}";
var splitme = foo.Split(new char[] { '{', '}'});
现在让我们通过在初始 opening/closing { } 中添加嵌套 { } 使其变得更加复杂,最多 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 逐行读取这个坏男孩,并跟踪有多少 {我 运行 在他们开始关闭相应的 } 之前。在 {} 的每个块中,我找到那个 =,然后找出我刚刚找到的键值对,以及它在层次结构中的位置。这……似乎不太理想。是否有更好的方法使用一些正则表达式魔术或现成的文本解析库?
我的第一个想法是查看 JSON 解析器,看看它是如何完成的。
您的示例看起来最好通过递归进行解析:例如,将 tech_ship_armor_5
视为一个对象,获取其开始标记,验证其结束标记是否存在,然后从那里开始。
那么你会有一个 tech_ship_armor_5.area
属性 的值为 engineering
; category
属性 的值将是另一个具有自己属性的对象 materials
。
是的,JSON-like 解析是解决此问题的方法。
因此,使用良好的 'ol string.split,根据定界符拆分字符串很容易。现在假设我想拆分一个开放的大括号和一个封闭的大括号。也很简单:
var foo = "{foo}{bar}";
var splitme = foo.Split(new char[] { '{', '}'});
现在让我们通过在初始 opening/closing { } 中添加嵌套 { } 使其变得更加复杂,最多 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 逐行读取这个坏男孩,并跟踪有多少 {我 运行 在他们开始关闭相应的 } 之前。在 {} 的每个块中,我找到那个 =,然后找出我刚刚找到的键值对,以及它在层次结构中的位置。这……似乎不太理想。是否有更好的方法使用一些正则表达式魔术或现成的文本解析库?
我的第一个想法是查看 JSON 解析器,看看它是如何完成的。
您的示例看起来最好通过递归进行解析:例如,将 tech_ship_armor_5
视为一个对象,获取其开始标记,验证其结束标记是否存在,然后从那里开始。
那么你会有一个 tech_ship_armor_5.area
属性 的值为 engineering
; category
属性 的值将是另一个具有自己属性的对象 materials
。
是的,JSON-like 解析是解决此问题的方法。