gpt4 book ai didi

c++ - 您应该如何使用 C++11 Regex 从存储在文本文件中的表创建变量?

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:13 24 4
gpt4 key购买 nike

这可能是一个相当微不足道的问题,但我对正则表达式在 C++ 中的工作方式感到困惑。我有一个如下所示的文本文件:

Weapons:    Cost  Damage  Armor
Dagger 8 4 0
Shortsword 10 5 0
Warhammer 25 6 0
Longsword 40 7 0
Greataxe 74 8 0

我想将每个武器的名称、成本、伤害和护甲存储在一个结构中。我尝试使用以下代码来做到这一点:

regex rule("(\\w+)\s(\\w+)\s(\\w+)\s(\\w+)");
smatch match;

for (int i = 0; i < 6; i++) {
if (regex_match(lines[i], match, rule)) {
struct Weapon Weapon;
Weapon.Name = match[1];
Weapon.Cost = stoi(match[2], NULL, 10);
Weapon.Damage = stoi(match[3], NULL, 10);
Weapon.ArmorValue = stoi(match[4], NULL, 10);
Weapons.push_back(Weapon);
}
}

但是 if 语句总是返回 false。

我是否错误地使用了正则表达式规则?

我应该如何使用 Regex 将该表中的数据存储在结构中?

最佳答案

首先,我认为您的正则表达式应该更像这样:
(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)

你只是在那里丢失了空格。

现在只需遍历数组并记住 first 第零匹配是“ Dagger 8 4 0”(带空格)

编辑:接下来的比赛如下:

匹配[1] = " Dagger "
匹配[2] = "8"
匹配[3] = "4"
匹配[4] = "0"

这是我的测试代码:

std::string data = "Dagger        8     4       0";
std::regex rule("(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)");
std::smatch match;
if (regex_match(data, match, rule)) {
std::cout << match[0] << std::endl << match[1] << match[2] << match[3] << match[4] << std::endl;
}

编辑 2:就个人而言,我宁愿使用\d 而不是\w,原因如下:

让我们假设其中一行看起来像这样:《 Dagger 3 3字》

使用\w 将采用 'word' 并且 regex_match 现在返回 true 假设您的 Weapon.ArmorValue 是某种数值数据,此 char* 将转换为该数值并且数据状态不佳。(* )

但是使用\d 会使您的 regex_match 返回 false,因为“单词”不是数字。当然,我假设那些是整数( double 和 float 需要像\d+.\d+ 这样的正则表达式)因此你的正则表达式现在看起来像这样:

(\w+)\s+(\d+)\s+(\d+)\s+(\d+)

(*)或者更糟 - 它可能引发一些异常,导致您的程序停止。

关于c++ - 您应该如何使用 C++11 Regex 从存储在文本文件中的表创建变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com