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

C++中不使用Boost从字符串提取数字的实现方法

在C++中提取字符串中的数字序列(不使用Boost)

我明白你的困惑——Java里处理这类字符串提取问题确实顺手,但C++里不用Boost的话,完全可以靠标准库搞定。这里有两种实用的方法,都能从char *word="R12_X8_10";里提取出{"12", "8", "10"}:

方法1:手动遍历字符串收集数字

这种方法兼容性最好,哪怕是老版本的C++编译器也能跑,核心思路就是逐个字符检查,把连续的数字字符攒成字符串,遇到非数字时就把攒好的数字存入结果:

#include <iostream>
#include <vector>
#include <string>
#include <cctype>  // 用于isdigit函数

using namespace std;

vector<string> extractNumbers(const char* str) {
    vector<string> result;
    string currentNum;
    
    // 遍历字符串的每个字符
    for (const char* p = str; *p != '\0'; ++p) {
        if (isdigit(static_cast<unsigned char>(*p))) {  // 转成unsigned char避免未定义行为
            currentNum += *p;
        } else {
            // 如果已经攒了数字,就存入结果并清空临时字符串
            if (!currentNum.empty()) {
                result.push_back(currentNum);
                currentNum.clear();
            }
        }
    }
    // 处理字符串末尾的数字(比如示例里的"10")
    if (!currentNum.empty()) {
        result.push_back(currentNum);
    }
    
    return result;
}

int main() {
    char *word = "R12_X8_10";
    vector<string> nums = extractNumbers(word);
    
    // 打印验证结果
    cout << "提取到的数字:";
    for (size_t i = 0; i < nums.size(); ++i) {
        if (i > 0) cout << ", ";
        cout << "\"" << nums[i] << "\"";
    }
    // 输出:提取到的数字:"12", "8", "10"
    return 0;
}

注意这里用static_cast<unsigned char>转一下字符,是因为isdigit的参数如果是负数(某些字符编码下可能出现)会导致未定义行为,转一下更安全。

方法2:用C++11及以上的正则表达式(更简洁)

如果你的项目支持C++11或更高版本,用标准库的<regex>会更省心,一行正则就能匹配所有数字序列:

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

using namespace std;

vector<string> extractNumbers(const char* str) {
    vector<string> result;
    // 正则表达式"\d+"匹配一个或多个连续数字
    regex numRegex(R"(\d+)");
    string inputStr(str);
    
    // 用迭代器遍历所有匹配结果
    sregex_iterator it(inputStr.begin(), inputStr.end(), numRegex);
    sregex_iterator endIter;  // 默认构造的迭代器表示结束
    
    for (; it != endIter; ++it) {
        result.push_back(it->str());
    }
    
    return result;
}

int main() {
    char *word = "R12_X8_10";
    vector<string> nums = extractNumbers(word);
    
    cout << "提取到的数字:";
    for (const auto& num : nums) {
        cout << "\"" << num << "\" ";
    }
    // 输出:提取到的数字:"12" "8" "10"
    return 0;
}

这里用了原始字符串字面量R"(\d+)",避免了转义字符的麻烦,直接写出正则表达式即可。两种方法都完全不依赖Boost,纯标准库实现,按需选择就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:26