【QML】解决 Qt C++ 正则表达式中文匹配问题

在qt中解析复杂的中文文本一直出现乱码的问题,参考了很多也解决不了,当前的场景是在qml中点击解析,文件内容为:

整体分析
1. **作战目标核心要素**:精准定位敌方指挥所并实施打击,需完成侦察→打击→毁伤评估全流程,核心目标为价值0.95的指挥所。
2. **任务阶段划分及功能**- 阶段1(侦察):需覆盖敌方阵地范围(x:200-1000,y:5000-10000),必备载荷为多光谱侦察相机(视距10km)或光电吊舱(探测距离75km)
   - 阶段2(打击):需覆盖指挥所位置(610,8620),必备载荷为制导炮弹(制导距离6km)或雷达侦察载荷(探测距离250km)
   - 阶段3(评估):需再次确认毁伤状态,需保留光电侦察载荷(探测距离60km)
3. **必要平台/载荷筛选**- 无侦-7(价值0.9):多光谱相机(95.2%识别精度)+电抗设备(干扰距离50km)→满足侦察和电磁压制需求
   - KV005H(价值0.8):光电吊舱(75km探测距离)+破片炮弹(6km制导距离)→兼顾侦察与打击
   - 无直-2(价值0.7):雷达侦察载荷(250km探测距离)→满足远距离侦察需求
   - KVD001(价值0.4):破片炮弹(6km制导距离)→低成本打击

优先级分析
- **资源投入成本优先**:减少平台数量(保留KVD001×8+无直-2×2),将无侦-7部署至阵地2(35200-51000,18000-26000)中心点(43100,22000),使用雷达侦察载荷替代光电吊舱,降低总成本至360w美元
- **任务完成率优先**:保留无侦-7×1+KV005H×2,部署无侦-7至阵地2(43100,22000)执行高速侦察,KV005H部署至阵地1(23800,24000)实施精确打击,确保指挥所识别精度达95.2%
- **任务完成时间优先**:将无侦-7部署至阵地1(23800,24000)执行快速侦察(6.1小时续航),KVD001部署至阵地1(23800,24000)实施打击(4小时续航),压缩总时长至10小时
- **损耗优先**:将无直-2部署至阵地1(23800,24000)执行远距离侦察(雷达载荷250km探测距离),KV005H部署至阵地2(43100,22000)实施打击,减少暴露在敌方无人机(750km/h)威胁下的概率
- **任务价值优先**:保留无侦-7×1+KV005H×2,无侦-7部署至阵地2(43100,22000)执行高价值目标(指挥所)侦察,KV005H部署至阵地1(23800,24000)实施精确打击,确保指挥所摧毁概率达95.2%


文字建议
1. **资源投入成本优先**:部署KVD001×8至阵地1(21500,23000)执行打击,无直-2×2至阵地1(23800,24000)执行远距离侦察,减少高价值平台数量
2. **任务完成率优先**:无侦-7×1至阵地2(43100,22000)执行高速侦察,KV005H×2至阵地1(23800,24000)实施精确打击,确保指挥所识别精度
3. **任务完成时间优先**:无侦-7×1至阵地1(23800,24000)快速侦察,KVD001×8至阵地1(23800,24000)立即打击,压缩总时长至10小时
4. **损耗优先**:无直-2×2至阵地1(23800,24000)执行远距离侦察,KV005H×2至阵地2(43100,22000)实施打击,减少暴露风险
5. **任务价值优先**:无侦-7×1至阵地2(43100,22000)重点侦察指挥所,KV005H×2至阵地1(23800,24000)实施精确打击,聚焦高价值目标


json
{
  "资源投入成本优先": {
    "KVD001": {
      "平台数量": [8],
      "平台位置": [21500,23000],
      "载荷": {
        "破片型炮弹": {"载荷数量": [4]}
      }
    },
    "无直-2": {
      "平台数量": [2],
      "平台位置": [23800,24000],
      "载荷": {
        "雷达侦察载荷": {"载荷数量": [1]}
      }
    }
  },
  "任务完成率优先": {
    "无侦-7": {
      "平台数量": [1],
      "平台位置": [43100,22000],
      "载荷": {
        "多光谱侦察相机": {"载荷数量": [1]}
      }
    },
    "KV005H": {
      "平台数量": [2],
      "平台位置": [23800,24000],
      "载荷": {
        "光电吊舱": {"载荷数量": [1]}
      }
    }
  },
  "任务完成时间优先": {
    "无侦-7": {
      "平台数量": [1],
      "平台位置": [23800,24000],
      "载荷": {
        "多光谱侦察相机": {"载荷数量": [1]}
      }
    },
    "KVD001": {
      "平台数量": [8],
      "平台位置": [23800,24000],
      "载荷": {
        "破片型炮弹": {"载荷数量": [4]}
      }
    }
  },
  "损耗优先": {
    "无直-2": {
      "平台数量": [2],
      "平台位置": [23800,24000],
      "载荷": {
        "雷达侦察载荷": {"载荷数量": [1]}
      }
    },
    "KV005H": {
      "平台数量": [2],
      "平台位置": [43100,22000],
      "载荷": {
        "光电吊舱": {"载荷数量": [1]}
      }
    }
  },
  "任务价值优先": {
    "无侦-7": {
      "平台数量": [1],
      "平台位置": [43100,22000],
      "载荷": {
        "多光谱侦察相机": {"载荷数量": [1]}
      }
    },
    "KV005H": {
      "平台数量": [2],
      "平台位置": [23800,24000],
      "载荷": {
        "光电吊舱": {"载荷数量": [1]}
      }
    }
  }
}

需要解析一个这样的txt文件,并分别提取其中的内容,将其分为四块内容

代码方法如下:

1. 确保正确的编码处理

首先,确保您的源代码文件和文本文件都使用 UTF-8 编码:

 1 void FileParser::parseFile(const QString &filePath)
 2 {
 3     QFile file(filePath);
 4     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
 5         emit errorOccurred(tr("无法打开文件: %1").arg(filePath));
 6         return;
 7     }
 8 
 9     QTextStream in(&file);
10     in.setCodec("UTF-8");
11     QString content = in.readAll();
12     file.close();
13 
14     qDebug() << "File content size:" << content.size();
15 
16     // 清空之前的数据
17     m_overallAnalysis.clear();
18     m_priorityAnalysis.clear();
19     m_adviceList.clear();
20     m_jsonData = QJsonObject();
21     m_fullContent = content;
22 
23     // 尝试提取各部分内容,如果失败则使用完整内容
24     if (!extractSections(content)) {
25         m_overallAnalysis = content; // 如果解析失败,将完整内容放在整体分析中
26     }
27 
28     emit dataChanged();
29 }

2. 使用 Unicode 属性进行正则表达式匹配

 1 bool FileParser::extractSections(const QString &content)
 2 {
 3     bool success = true;
 4 
 5     // 使用 Unicode 属性匹配中文字符
 6     QRegularExpression overallRegex(u8"整体分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=优先级分析|文字建议|json|$)",
 7                                     QRegularExpression::DotMatchesEverythingOption |
 8                                         QRegularExpression::UseUnicodePropertiesOption);
 9 
10     QRegularExpression priorityRegex(u8"优先级分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=文字建议|json|$)",
11                                      QRegularExpression::DotMatchesEverythingOption |
12                                          QRegularExpression::UseUnicodePropertiesOption);
13 
14     QRegularExpression adviceRegex(u8"文字建议[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=json|$)",
15                                    QRegularExpression::DotMatchesEverythingOption |
16                                        QRegularExpression::UseUnicodePropertiesOption);
17 
18     QRegularExpression jsonRegex(u8"json[\\s\\n]*[::]?[\\s\\n]*(\\{.*\\})",
19                                  QRegularExpression::DotMatchesEverythingOption |
20                                      QRegularExpression::UseUnicodePropertiesOption);
21 
22 
23     // 提取整体分析
24     QRegularExpressionMatch overallMatch = overallRegex.match(content);
25     if (overallMatch.hasMatch()) {
26         m_overallAnalysis = overallMatch.captured(1).trimmed();
27         qDebug() << "Overall analysis found, length:" << m_overallAnalysis.length();
28     } else {
29         qDebug() << "Overall analysis not matched";
30         success = false;
31     }
32 
33     // 提取优先级分析
34     QRegularExpressionMatch priorityMatch = priorityRegex.match(content);
35     if (priorityMatch.hasMatch()) {
36         m_priorityAnalysis = priorityMatch.captured(1).trimmed();
37         qDebug() << "Priority analysis found, length:" << m_priorityAnalysis.length();
38     } else {
39         qDebug() << "Priority analysis not matched";
40         success = false;
41     }
42 
43     // 提取建议列表
44     QRegularExpressionMatch adviceMatch = adviceRegex.match(content);
45     if (adviceMatch.hasMatch()) {
46         QString adviceText = adviceMatch.captured(1).trimmed();
47         qDebug() << "Advice text found, length:" << adviceText.length();
48 
49         // 分割每条建议 - 更灵活的正则表达式,适应中文格式
50         QRegularExpression adviceItemRegex("(\\d+)[\\..]?\\s*([^::]+)[::]?\\s*(.*)");
51         QStringList lines = adviceText.split("\n", Qt::SkipEmptyParts);
52 
53         for (const QString &line : lines) {
54             QRegularExpressionMatch itemMatch = adviceItemRegex.match(line);
55             if (itemMatch.hasMatch()) {
56                 QString title = itemMatch.captured(2).trimmed();
57                 QString description = itemMatch.captured(3).trimmed();
58 
59                 QVariantMap adviceItem;
60                 adviceItem["title"] = title;
61                 adviceItem["description"] = description;
62 
63                 m_adviceList.append(adviceItem);
64                 qDebug() << "Added advice:" << title;
65             } else if (!line.trimmed().isEmpty()) {
66                 // 如果正则不匹配但仍然有内容,添加到列表
67                 QVariantMap adviceItem;
68                 adviceItem["title"] = "建议";
69                 adviceItem["description"] = line.trimmed();
70                 m_adviceList.append(adviceItem);
71                 qDebug() << "Added fallback advice:" << line;
72             }
73         }
74     } else {
75         qDebug() << "Advice section not matched";
76         success = false;
77     }
78 
79     // 提取JSON数据
80     QRegularExpressionMatch jsonMatch = jsonRegex.match(content);
81     if (jsonMatch.hasMatch()) {
82         QString jsonStr = jsonMatch.captured(1).trimmed();
83         qDebug() << "JSON string found, length:" << jsonStr.length();
84         parseJsonData(jsonStr);
85     } else {
86         qDebug() << "JSON section not matched";
87         success = false;
88     }
89 
90     return success;
91 }

 

 1 void FileParser::parseJsonData(const QString &jsonStr)
 2 {
 3     QJsonParseError error;
 4     QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error);
 5 
 6     if (error.error == QJsonParseError::NoError && doc.isObject()) {
 7         m_jsonData = doc.object();
 8         qDebug() << "JSON parsed successfully, keys:" << m_jsonData.keys();
 9     } else {
10         qDebug() << "Failed to parse JSON:" << error.errorString();
11     }
12 }

 

关键点在于:

  // 使用 Unicode 属性匹配中文字符
    QRegularExpression overallRegex(u8"整体分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=优先级分析|文字建议|json|$)",
                                    QRegularExpression::DotMatchesEverythingOption | 
                                    QRegularExpression::UseUnicodePropertiesOption);
    
    QRegularExpression priorityRegex(u8"优先级分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=文字建议|json|$)",
                                     QRegularExpression::DotMatchesEverythingOption | 
                                     QRegularExpression::UseUnicodePropertiesOption);
    
    QRegularExpression adviceRegex(u8"文字建议[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=json|$)",
                                   QRegularExpression::DotMatchesEverythingOption | 
                                   QRegularExpression::UseUnicodePropertiesOption);
    
    QRegularExpression jsonRegex(u8"json[\\s\\n]*[::]?[\\s\\n]*(\\{.*\\})",
                                 QRegularExpression::DotMatchesEverythingOption | 
                                 QRegularExpression::UseUnicodePropertiesOption);
 若去掉后面的json数据,则解析需要变成:
 1     // 使用 Unicode 属性匹配中文字符,去掉 json 部分的匹配
 2     QRegularExpression overallRegex(u8"整体分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=优先级分析|文字建议|$)",
 3                                     QRegularExpression::DotMatchesEverythingOption |
 4                                         QRegularExpression::UseUnicodePropertiesOption);
 5 
 6     QRegularExpression priorityRegex(u8"优先级分析[\\s\\n]*[::]?[\\s\\n]*(.*?)(?=文字建议|$)",
 7                                      QRegularExpression::DotMatchesEverythingOption |
 8                                          QRegularExpression::UseUnicodePropertiesOption);
 9 
10     QRegularExpression adviceRegex(u8"文字建议[\\s\\n]*[::]?[\\s\\n]*(.*?)$",
11                                    QRegularExpression::DotMatchesEverythingOption |
12                                        QRegularExpression::UseUnicodePropertiesOption);

 

 
 
 
 

 

posted @ 2025-09-11 13:50  taohuaxiaochunfeng  阅读(38)  评论(0)    收藏  举报