使用std::regex拆分含引号字符串时仅得空串的问题排查
问题分析与解决方案
核心问题
你的代码存在两个关键错误,导致输出仅为空格:
sregex_token_iterator参数误用
你传入的第四个参数是-1,该参数的作用是返回正则表达式匹配之外的内容(即你用来拆分的空格分隔符),因此输出自然都是空格。若要获取拆分后的目标元素,应传入0(表示获取整个正则匹配结果)。正则表达式转义错误
在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
相关产品推荐
相关产品推荐

