你应该如何使用C++;11正则表达式从存储在文本文件中的表创建变量? 这可能是一个相当琐碎的问题,但我对ReGEX如何在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

你应该如何使用C++;11正则表达式从存储在文本文件中的表创建变量? 这可能是一个相当琐碎的问题,但我对ReGEX如何在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,c++,regex,c++11,C++,Regex,C++11,我想把每种武器的名称、成本、伤害和护甲存储在一个结构中。我尝试使用以下代码执行此操作: 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];

我想把每种武器的名称、成本、伤害和护甲存储在一个结构中。我尝试使用以下代码执行此操作:

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);
    }
}
regex规则(“(\\w+)\s(\\w+)\s(\\w+)\s(\\w+)”;
小比赛;
对于(int i=0;i<6;i++){
if(正则表达式匹配(行[i],匹配,规则)){
结构武器;
武器名称=匹配[1];
武器成本=stoi(匹配[2],空,10);
武器伤害=stoi(匹配[3],无效,10);
ArmorValue=stoi(匹配[4],空,10);
武器。推回(武器);
}
}
但是if语句总是返回false

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


我应该如何使用正则表达式将该表中的数据存储在结构中?

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

你刚才在那里失去了空间

现在只需迭代数组,记住第一个零次匹配是 “匕首8 4 0”(带空格)

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

匹配[1]=“匕首”
匹配[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;
}
std::string data=“Dagger 8 4 0”;
标准::正则表达式规则(“(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)”;
std::smatch匹配;
if(正则表达式匹配(数据、匹配、规则)){

std::cout\字符串内的文字需要转义,所以您需要\\无处不在。最好使用原始字符串文字
规则(R)((\\w+)\s(\\w+)\s(\\w+)\s(\\w+)\s(\\w+))
@Praetorian谢谢您的回答!所以对于原始字符串文字,我可以使用单个反斜杠,而不需要转义?(只是想知道,因为您仍然有转义的\w字符)哦,对不起,没有注意到您实际试图解析的内容,只是注意到您在原始文件中没有转义的
\s
。您不需要转义任何反斜杠。
规则(R)((\w+)\s(\w+)\s(\w+)\s(\w+))
如果你不需要使用regex,你可以用
ifstream
逐行读取文件。就像
在>>名称>>中花费>>伤害>>护甲;
Hmm,我想是否可以调整regex以允许武器名称中有空格和数字。我想这会很棘手。谢谢你的帮助,它成功了!出于兴趣,你为什么要这么做是否改用\d?