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

Qt5 QRegExp如何替换双引号字符串内部的空格而不改动其余内容

Qt 5使用QRegExp替换双引号内空格的实现方案

问题分析

你当前编写的代码存在两个问题:

  • 正则\"(.+)\"是贪婪匹配,当字符串中存在多对双引号时会跨引号匹配,不符合预期
  • 直接将整个匹配到的带引号片段替换为下划线,没有只修改片段内部的空格

解决方案

你可以参照JavaScript方案的逻辑:先匹配所有双引号包裹的片段,再逐个替换片段内部的空格后写回原字符串,示例代码如下:

#include <QRegExp>
#include <QDebug>

int main() {
    QString str = "text a b c text \"text text1 text2\" text d e f";
    // 正则匹配双引号包裹的所有内容,[^\"]规则确保不会跨引号匹配
    QRegExp quoteReg("\"[^\"]*\"");
    int matchPos = 0;

    while ((matchPos = quoteReg.indexIn(str, matchPos)) != -1) {
        // 获取当前匹配到的完整带引号内容
        QString matchContent = quoteReg.cap(0);
        // 仅替换匹配内容内部的空格为下划线
        QString processed = matchContent.replace(' ', '_');
        // 替换回原字符串
        str.replace(matchPos, matchContent.length(), processed);
        // 移动指针跳过已处理的片段,避免重复匹配
        matchPos += processed.length();
    }

    qDebug() << str;
    // 输出结果:"text a b c text \"text_text1_text2\" text d e f"
}

补充说明

如果你的项目使用Qt 5.1及以上版本,也可以改用QRegularExpression的lambda替换重载,写法更简洁,但上述QRegExp的实现方案兼容所有Qt 5版本,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:54:01