48 lines
1.6 KiB
C++
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;
|
||
|
|
}
|