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
相关产品推荐
相关产品推荐

