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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:51