当前位置: 首页 > news >正文

【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);
 

 

http://www.wxhsa.cn/company.asp?id=973

相关文章:

  • C# 内存泄漏
  • 产品包装盒这样制作,再也不用到处求人啦!超简单的上手方法分享!
  • FunctionAI 图像生成:简化从灵感到 API 调用的每一步
  • ​​电力系统的“慧眼”:深入解析电流互感器的核心用途​​
  • 2025.9记录
  • AQS
  • TVBox中的Python接口解读
  • 一、CPU的功能和基本结构
  • DevOps时代的知识管理革命:如何构建智能化的研发决策中枢
  • P1099 [NOIP 2007 提高组] 树网的核
  • [GenAI] 外接DeepSeek
  • 一个简单美观的文件时间修改器
  • 暗黑类游戏属性系统程序设计思路3.0
  • 完整教程:毕设课题:基于Node.js+Express框架+Mysql数据库的助农农产品销售商城设计与实现
  • 经典的混合加密传输协议—PGP
  • 2025年互联网行业专业工艺认证发展指南
  • 基本数据类型转换
  • C# Avalonia 13- MoreDrawing - VisualLayer
  • Linux 设置nginx 以及java jar自启动
  • DevelPy-TryHackMe
  • 记录一次解决phpstudy启动数据库自动关闭的问题方法
  • cache redis
  • 《爱上情感:自然魅力的社交》
  • Java的基本数据类型
  • H5游戏性能优化系列-----配置相关优化
  • 300 毫秒生成情感 AI 视频,Nuance Labs 获千万美元融资;AirPods Pro 3 将集成实时语音翻译丨日报
  • 认知引擎:企业下一个决胜分水岭
  • node.js安装地址
  • 【已解决】git Encountered 3 file(s) that should have been pointers, but werent
  • 接雨水-leetcode