2016-05-21 49 views
0

所以,根据分隔符分割字符串很容易,只需使用'string.split'。现在让我们说我想分开一个开放的花括号和一个封闭的花括号。也可以直接使用:在嵌套分隔符之间标记字符串

var foo = "{foo}{bar}"; 
var splitme = foo.Split(new char[] { '{', '}'}); 

现在让我们通过在初始打开/关闭{}内添加嵌套{},使其更加复杂,最多达n层深。我所追求的是试图解析一个看起来是游戏MOD的专有文本文件格式(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

使用类似ANTLR的词法分析器 – dman2306

回答

1

我首先想到的是看一下JSON解析器,看看它是如何完成的。

您的示例看起来最好通过递归进行解析:例如,请考虑tech_ship_armor_5是一个对象,获取其开始标记,验证其结束标记的存在并从那里开始。

那么你会有一个tech_ship_armor_5.area属性的值为engineering;那么category属性的值将是具有其自己的属性的另一个对象materials

是的,类似JSON的解析就是解决这个问题的方法。

+0

我喜欢这样。只捕获第一个和最后一个标记,然后取内部并递归执行相同的操作。好主意。我会在明天早上写这篇文章,可能会有一些跟进的,否则我认为这是要走的路。 (加上我会接受答案一旦写完) –

+0

@BillSambrone:很高兴你的工作。 – InteXX

相关问题