eis/TestProject/play_gruond/exp_extract.hpp

48 lines
1.6 KiB
C++

#include <cctype> // 用于 isdigit 函数
#include <stdexcept> // 可选,用于异常处理(如 stoi 的异常)
#include <string>
#include <vector>
using namespace std;
vector<int> extractTagNumbers(const string &expr) {
vector<int> result;
const string tagPrefix = "tag"; // 定义要查找的前缀
size_t pos = 0; // 当前查找位置
while (pos < expr.size()) {
// 查找下一个 "tag" 的出现位置
size_t found = expr.find(tagPrefix, pos);
if (found == string::npos) {
break; // 没有更多 "tag",退出循环
}
// 计算数字部分的起始位置(在 "tag" 之后)
size_t numStart = found + tagPrefix.size();
size_t numEnd = numStart;
// 提取连续的数字字符序列(直到遇到非数字字符,如 '+' 或字符串结尾)
while (numEnd < expr.size() && isdigit(expr[numEnd])) {
numEnd++;
}
// 如果存在数字序列,则转换为整数并添加到结果中
if (numEnd > numStart) {
string numStr = expr.substr(numStart, numEnd - numStart);
try {
int num = stoi(numStr); // 将字符串转换为整数[7](@ref)
result.push_back(num);
} catch (const invalid_argument &e) {
// 处理无效数字字符串(例如非数字内容),根据需求可忽略或记录错误
// 这里选择跳过无效转换,继续处理后续部分
} catch (const out_of_range &e) {
// 处理数字超出 int 范围的情况,同样跳过
}
}
// 更新查找位置到当前数字序列的末尾,继续搜索
pos = numEnd;
}
return result;
}