【问题标题】:tokenizing a string between nested delimiters标记嵌套分隔符之间的字符串
【发布时间】: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这样的词法分析器

标签: c# string tokenize


【解决方案1】:

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

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

那么您将拥有一个值为engineeringtech_ship_armor_5.area 属性;然后category 属性的值将是另一个对象materials,具有自己的属性。

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

【讨论】:

  • 我喜欢这个。只捕获第一个和最后一个标签,然后取出内部并递归地做同样的事情。好主意。我明天早上会写这个,可能会有几个跟进?,否则我认为这是要走的路。 (加上写完后我会接受答案)
猜你喜欢
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多