C++中以/和-为分隔符拆分字符串(分隔符顺序未知)
嘿,这个问题我刚好有几个实用的解法!在C++里要按任意顺序的/和-拆分字符串,其实有几种灵活的方式,我给你一一说明:
方法1:手动循环查找分隔符(兼容性最好)
这种方法不依赖任何C++版本特性,所有标准都能用。核心思路就是反复定位任意一个分隔符的位置,截取中间的子串作为标记,直到遍历完整个字符串。
代码示例:
#include <iostream> #include <string> #include <vector> using namespace std; vector<string> splitString(const string& line) { vector<string> tokens; size_t start = 0; size_t pos; // 从start位置开始,找第一个`/`或`-`的位置 while ((pos = line.find_first_of("/-", start)) != string::npos) { // 避免连续分隔符生成空串,只有当start和pos之间有内容时才添加 if (pos > start) { tokens.push_back(line.substr(start, pos - start)); } start = pos + 1; } // 处理字符串末尾剩下的最后一个标记 if (start < line.size()) { tokens.push_back(line.substr(start)); } return tokens; } int main() { string line = "3QQT38/28-12/AA"; vector<string> result = splitString(line); // 输出拆分结果 for (const auto& token : result) { cout << token << endl; } return 0; }
运行这段代码,就能得到你想要的四个子串:3QQT38、28、12、AA。而且它还能处理连续分隔符的情况(比如3QQT38//28--12),不会生成空的无效子串。
方法2:使用C++11正则表达式(代码最简洁)
如果你的项目支持C++11及以后的标准,用正则表达式会让代码更简洁易读。我们可以直接匹配所有**不包含/和-**的连续字符,这些就是我们要的标记。
代码示例:
#include <iostream> #include <string> #include <vector> #include <regex> using namespace std; vector<string> splitString(const string& line) { vector<string> tokens; // 正则规则:匹配一个或多个非`/`、非`-`的字符 regex re("[^/-]+"); // 用迭代器遍历所有匹配的子串 sregex_token_iterator it(line.begin(), line.end(), re, 0); sregex_token_iterator end; // 把所有匹配结果存入vector for (; it != end; ++it) { tokens.push_back(*it); } return tokens; } int main() { string line = "3QQT38/28-12/AA"; vector<string> result = splitString(line); for (const auto& token : result) { cout << token << endl; } return 0; }
这个方法的核心是正则表达式[^/-]+,[^...]表示匹配不在括号内的字符,+表示匹配至少一个。sregex_token_iterator会自动帮我们找出所有符合规则的子串,省了手动循环的麻烦。
方法3:逐字符处理(最直观)
如果你想彻底搞清楚拆分的底层逻辑,可以用stringstream逐个读取字符,把非分隔符的字符拼接成标记,遇到分隔符就保存当前标记并重置。
代码示例:
#include <iostream> #include <string> #include <vector> #include <sstream> using namespace std; vector<string> splitString(const string& line) { vector<string> tokens; stringstream ss(line); string currentToken; char c; // 逐个读取字符串里的每个字符 while (ss.get(c)) { // 如果是分隔符,就保存当前标记(非空的话) if (c == '/' || c == '-') { if (!currentToken.empty()) { tokens.push_back(currentToken); currentToken.clear(); } } else { // 不是分隔符就拼接到当前标记里 currentToken += c; } } // 别忘了最后一个标记 if (!currentToken.empty()) { tokens.push_back(currentToken); } return tokens; } int main() { string line = "3QQT38/28-12/AA"; vector<string> result = splitString(line); for (const auto& token : result) { cout << token << endl; } return 0; }
这个方法就像手工拆分字符串一样,每一步都清晰可控,适合新手理解拆分的过程。
内容的提问来源于stack exchange,提问作者user3819973
相关产品推荐
相关产品推荐

