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

如何查找QStringList中含指定子串的元素位置与命中数

问题原因

你原有代码返回-1、无法正确统计的核心原因有3个:

  • 正则写法错误:C++字符串中反斜杠需要双写转义,你写的\T属于非法转义序列,同时正则表达式的括号没有闭合,本身就是无效的匹配规则;另外你写的$是强制匹配行尾,但示例日志中第二个Target_Hit末尾带空格,直接匹配行尾会漏判。
  • 接口用错:indexOf()只会返回第一个匹配项的索引,根本无法遍历拿到所有匹配位置,也统计不了总命中数。
  • 没必要用正则:单纯判断子串存在性用字符串自带的contains接口,性能更高、也不会出现正则语法错误。
正确实现代码

直接遍历QStringList逐行判断即可,代码可直接运行:

#include <QStringList>
#include <QDebug>

// 这里替换成你已经加载好的日志列表
QStringList logLines;

QList<int> hitRowIndexes; // 存储所有命中的行索引(从0开始计数)
int totalHits = 0;

for (int idx = 0; idx < logLines.size(); idx++) {
    const QString& line = logLines[idx];
    // 跳过空行,不需要处理
    if (line.trimmed().isEmpty()) {
        continue;
    }
    // 直接判断是否包含目标子串
    if (line.contains("Target_Hit")) {
        totalHits++;
        hitRowIndexes.append(idx);
    }
}

// 输出结果
qDebug() << "总命中数:" << totalHits;
qDebug() << "命中行位置(索引从0开始):" << hitRowIndexes;

如果你后续需要扩展匹配规则、必须用正则的话,Qt5更推荐用QRegularExpression替代已经过时的QRegExp,写法如下:

#include <QRegularExpression>

QRegularExpression hitRe(R"(Target_Hit)"); // 用原始字符串避免转义问题
hitRowIndexes.clear();
totalHits = 0;

for (int idx = 0; idx < logLines.size(); idx++) {
    if (hitRe.match(logLines[idx]).hasMatch()) {
        totalHits++;
        hitRowIndexes.append(idx);
    }
}
针对你给出的示例日志的运行结果

如果日志加载时没有多余空行,最终统计结果为:

  • 总命中数:2
  • 对应行索引:6、10(对应第7行、第11行内容,和示例中两个带Target_Hit的行位置完全一致)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:54:18