在嵌套分隔符

时间:2016-05-21 02:51:50

标签: c# string tokenize

因此,使用良好的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,并跟踪在我们开始用相应的关闭之前遇到的问题。在{}的每个块中,我追捕那个=然后找出我刚刚找到的键值对,以及它在层次结构中的位置。这......似乎并不理想。使用一些正则表达式魔法或现成的文本解析库有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我的第一个想法是查看JSON解析器,看看它是如何在那里完成的。

您的示例看起来最好通过递归解析:例如,将tech_ship_armor_5视为对象,获取其开始标记,验证其结束标记的存在并从那里开始。

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

是的,类似JSON的解析就是这样的。