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




