【问题标题】:Qt Parsing a Custom File FormatQt 解析自定义文件格式
【发布时间】:2026-01-12 13:25:01
【问题描述】:

我有一堆自定义脚本,它们的文件格式与 JSON 相似,但又不一样。我想获取这些文件并将它们的数据吐入 QTreeWidget 并显示带有一些语法突出显示的原始代码。我不需要完成这些任务,我只需要一种干净的方式或想法来了解如何从这些任务中提取信息。这是脚本中的示例 sn-p。

例子:

"People"
{
    "Person 1"
    {
        "age"       "34"
        "name"      "John"
        "gender"    "male"
        "skills"
        {
            "skill 1"   "Intelligent"
            "skill 2"   "Wise"
            "skill 3"   "Buff as a bear!"
        }
    }
    "Person 2"
    {
        "age"       "25"
        "name"      "Jamie"
        "gender"    "helicopter"
    }
}

【问题讨论】:

  • 也许您需要一个“前瞻变量”?它将在您处理当前令牌时读取下一个令牌,因此您可以确定当前令牌是其父级的字段还是嵌套结构的名称。
  • 这种格式似乎是上下文无关的语法;你需要一个堆栈来解析它。您也许可以调整现有的 JSON 库以读取格式。
  • @MrEricSir 我的意思是我所要做的就是添加冒号、逗号和几个括号,然后它就是 JSON。正则表达式的痛苦
  • @NicholasJohnson 在这种情况下忘记使用正则表达式,因为您没有处理正则语法。对于 Stack Overflow 评论来说太复杂了,但 Chomsky hierarchy 解释了区别。
  • 最简单的解决方案 - 非常简单,因为更改只有几行 - 是复制 Qt 的 Json 实现并对其进行调整以处理您的语法。你得到了 Qt 的资源。使用它们!

标签: c++ regex qt parsing


【解决方案1】:

我尝试在 C++11/14 中使用正则表达式。但老实说,这不是一个有趣的问题,而且 regex 可能是不适合这项工作的工具。

我想出了将您的示例输入转换为有效 JSON 的代码:

#include <iostream>
#include <regex>
using namespace std;    
int main (int argc, const char * argv[]) {
std::string test = R"(
"People"
{
    "Person 1"
    {
        "age"       "34"
        "name"      "John"
        "gender"    "male"
        "skills"
        {
            "skill 1"   "Intelligent"
            "skill 2"   "Wise"
            "skill 3"   "Buff as a bear!"
        }
    }
    "Person 2"
    {
        "age"       "25"
        "name"      "Jamie"
        "gender"    "helicopter"
    }
}
)";
    regex reg(R"(("[^"]+")\s+("[^"]+"))");
    test = std::regex_replace(test, reg, "$1:$2,");
    regex reg2(R"((?:\A|\n)\s*("[^"]+")\s*(\n|\Z))");
    test = std::regex_replace(test, reg2, "$1:");
    regex reg3(R"(}\s*("[^"]+"):\s*\{)");
    test = std::regex_replace(test, reg3, "},\n$1: {");
    regex reg4(R"(,\s*})");
    test = std::regex_replace(test, reg4, "}");
    cout << "{" << test << "}" << endl;
}

输出:

{"People":{"Person 1":    {
        "age":"34",
        "name":"John",
        "gender":"male","skills":        {
            "skill 1":"Intelligent",
            "skill 2":"Wise",
            "skill 3":"Buff as a bear!"}
    },
"Person 2": {
        "age":"25",
        "name":"Jamie",
        "gender":"helicopter"}
}
}

Demo

但是,您的里程可能会因不同的、更复杂的输入而有所不同。

【讨论】: