#include // 用于 isdigit 函数 #include // 可选,用于异常处理(如 stoi 的异常) #include #include using namespace std; vector extractTagNumbers(const string &expr) { vector 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; }