C++如何按空格分割字符串但跳过反斜杠转义空格,无需自定义解析器可行吗?
我很惊讶这项需求如此常见,却还没有相关的问题提出。能否不自行编写解析器实现该功能?要求连续出现的多个空白符需直接跳过。若无法实现,以下是我提供的解决方案:
vector<string> split_with_backslash(const string &s) { vector<string> ret; const char *ps = s.c_str(); while (*ps++) { std::stringstream ss; switch (*ps) { default: ss << *ps; break; case ' ': case '\t': case '\n': ret.push_back(ss.str()); ss.str(string()); ss.clear(); break; case '\\': if (!(*++ps == ' ' || *ps == '\t' || *ps == '\n')) --ps; break; } } return ret; }
我不太擅长使用C++迭代器,所以此处使用了c_str()方法。
编辑: 为@MarekR补充wordexp相关示例,该内容和本问题高度相关,因为wordexp可以很好地处理引号、反斜杠转义,但无法处理下述特殊符号。
我此处正在实现执行流水线的预处理逻辑,通过该方式可以过滤wordexp无法处理的|符号,但目前还有<>&符号未处理(为简化逻辑暂不考虑&符号)。
vector<string> subcommands; boost::split(subcommands, cpp_buf, boost::is_any_of("|")); wordexp_t res; switch (wordexp(subcommands.back().c_str(), &res, 0)) { case 0: break; case WRDE_NOSPACE: wordfree(&res); default: exit(EXIT_FAILURE); }
内容的提问来源于stack exchange,提问作者sauce
相关产品推荐
相关产品推荐

