标记嵌套定界符之间的字符串

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 属性 的值为 engineeringcategory 属性 的值将是另一个具有自己属性的对象 materials

是的,JSON-like 解析是解决此问题的方法。