You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 5.9中如何从指定QString提取目标子字符串?

Qt 5.9下提取QString指定子串

需求说明

现有如下QString:

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication";

需要从中提取三个子串:

  • SoftwareName = MY_DISPLAY_OS(等号=之后、冒号:之前的文本)
  • Release = 2022-3(第一个点.之后、第二个点.之前的文本)
  • Version = 10.25.10086-1(第二个点.之后、最后一个点.之前的文本)

问题背景

尝试使用Qt 6.0+新增的sliced()方法实现,但当前使用Qt 5.9,该方法不兼容,无法正常运行。原有尝试代码:

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication";

QString SoftwareName = fileData.sliced(fileData.lastIndexOf(':'), fileData.indexOf('.'));

Qt 5.9兼容实现代码

在Qt 5.9中,可以使用mid()方法替代sliced(),结合indexOf()、lastIndexOf()定位关键字符位置,实现如下:

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication";

// 提取SoftwareName:=之后、:之前的文本
int eqPos = fileData.indexOf('=');
int colonPos = fileData.indexOf(':');
QString SoftwareName = fileData.mid(eqPos + 1, colonPos - eqPos - 1);

// 提取Release和Version:先定位到第一个.之后的部分
int firstDotPos = fileData.indexOf('.', colonPos);
QString afterFirstDot = fileData.mid(firstDotPos + 1);

// 拆分afterFirstDot为Release和Version部分
int secondDotPos = afterFirstDot.indexOf('.');
QString Release = afterFirstDot.left(secondDotPos);
QString Version = afterFirstDot.mid(secondDotPos + 1, afterFirstDot.lastIndexOf('.') - secondDotPos - 1);

// 输出验证
qDebug() << "SoftwareName:" << SoftwareName; // 输出 MY_DISPLAY_OS
qDebug() << "Release:" << Release;           // 输出 2022-3
qDebug() << "Version:" << Version;           // 输出 10.25.10086-1

代码说明

  • mid(pos, length):从指定位置pos开始,截取长度为length的子串;若省略length,则截取到字符串末尾。
  • left(n):截取字符串前n个字符。
  • indexOf(char, from):从指定起始位置from开始查找字符的索引,未找到返回-1。
  • lastIndexOf(char):从字符串末尾向前查找字符的索引。

内容的提问来源于stack exchange,提问作者Sudhanshu Ojha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:50:46