You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

QT开发:如何从QString中提取括号前后/空格分隔的数字集合?

嘿,作为有C++基础的QT新手,这个字符串提取问题其实很好解决,结合QT自带的字符串工具或者正则表达式就能轻松搞定!我给你两个实用的方案,你可以根据自己的需求选:

方案一:统一分隔符后分割提取

这个思路很直观,先把两种格式的字符串转换成统一的空格分隔形式,再拆分提取数字,适合格式比较规整的情况:

// 假设输入是两种格式之一
QString inputStr = "[1,2,45,345,98,452]"; 
// QString inputStr = "[1 2 45 345 98 452]";

// 1. 移除首尾的方括号
inputStr = inputStr.mid(1, inputStr.size() - 2); 
// 或者用remove:inputStr.remove(0, 1).remove(inputStr.length()-1, 1);

// 2. 把逗号替换成空格,统一成空格分隔的格式
inputStr = inputStr.replace(",", " ");

// 3. 按空格拆分,同时跳过空字符串(避免多个连续空格的情况)
QStringList numStrList = inputStr.split(" ", Qt::SkipEmptyParts);

// 4. 转换为整数数组并统计数量
QVector<int> numArray;
int totalCount = numStrList.size(); // 原始分割后的数量(包含可能转换失败的)
for (const QString& numStr : numStrList) {
    bool conversionOk;
    int num = numStr.toInt(&conversionOk);
    if (conversionOk) {
        numArray.append(num);
    }
}
// 最终有效数字数量是numArray.size(),数组里就是提取到的数字

方案二:正则表达式匹配(更灵活)

如果字符串格式可能有变化(比如混合空格和逗号,或者有多余符号),用正则表达式直接匹配所有数字是更稳妥的选择:

QString inputStr = "[1 2 45,345 98,452]"; // 混合格式也能处理
QRegularExpression numRegex(R"(\d+)"); // 匹配一个或多个连续数字
QRegularExpressionMatchIterator matchIter = numRegex.globalMatch(inputStr);

QVector<int> numArray;
while (matchIter.hasNext()) {
    QRegularExpressionMatch match = matchIter.next();
    numArray.append(match.captured().toInt());
}
int count = numArray.size(); // 直接就是有效数字的数量

小补充

  • 如果需要处理浮点数,可以把正则改成 R"(\d+\.?\d*)",然后用 toDouble() 转换;
  • 如果数字是超大整数,用 toLongLong() 替代 toInt() 避免溢出;
  • 可以加一些异常处理,比如输入字符串格式完全不符合时给出提示。

内容的提问来源于stack exchange,提问作者Memo Guerrero

火山引擎 最新活动