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

使用std::regex拆分含引号字符串时仅得空串的问题排查

问题分析与解决方案

核心问题

你的代码存在两个关键错误,导致输出仅为空格:

  1. sregex_token_iterator参数误用
    你传入的第四个参数是-1,该参数的作用是返回正则表达式匹配之外的内容(即你用来拆分的空格分隔符),因此输出自然都是空格。若要获取拆分后的目标元素,应传入0(表示获取整个正则匹配结果)。

  2. 正则表达式转义错误
    在C字符串中,反斜杠\需转义为\\,双引号"需转义为\"。你原代码中的\s和\"未正确转义,导致正则表达式实际解析错误,无法匹配目标内容。推荐使用C11及以上支持的原始字符串字面量R"()",可彻底避免转义繁琐问题。

修正后的代码

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string s = "A \"B C\" 123";
    // 使用原始字符串字面量,无需额外转义正则中的特殊字符
    std::regex exp(R"([^\s"']+|"([^"]*)"|'([^']*)')");

    // 传入0,获取正则匹配到的完整元素
    std::sregex_token_iterator itr(s.begin(), s.end(), exp, 0);
    std::sregex_token_iterator end;

    for (; itr != end; ++itr) {
        std::cout << *itr << std::endl;
    }
    return 0;
}

运行结果

输入字符串"A \"B C\" 123"会输出:

A
"B C"
123

可选优化(去掉引号)

如果希望输出时去掉引号内的引号,可调整为捕获组匹配:

std::regex exp(R"([^\s"']+|"([^"]*)"|'([^']*)')");
// 传入捕获组编号1和2,自动忽略空匹配
std::sregex_token_iterator itr(s.begin(), s.end(), exp, {1, 2});

此时输出会变成:

A
B C
123

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:40:39