bool Config::DecodeLine(const string & data) {
string strT = "(string)";
string intT = "(int)";
string floatT = "(float)";
string hexT = "(hex)";
string binT = "(bin)";
string blank = "(?:[ \\t]*)";
string vName = "([_a-zA-Z][_0-9a-zA-Z]*)";
string strVal = "(?:\"([^\"]*)\")";
string strExp = "(?:" + strT + blank + vName + blank + "=" + blank + strVal + blank + ";)";
string intVal = "([1-9][0-9]*|0)";
string intExp = "(?:" + intT + blank + vName + blank + "=" + blank + intVal + blank + ";)";
string binVal = "([01]{1,32})";
string binExp = "(?:" + binT + blank + vName + blank + "=" + blank + binVal + blank + ";)";
string hexVal = "([0-9A-F]{1,8})";
string hexExp = "(?:" + hexT + blank + vName + blank + "=" + blank + hexVal + blank + ";)";
string floatVal = "((?:[1-9][0-9]*|0)(?:\\.[0-9]*)?)";
string floatExp = "(?:" + floatT + blank + vName + blank + "=" + blank + floatVal + blank + ";)";
string allExp = "(?:" + strExp + "|" + intExp + "|" + floatExp + "|" + hexExp + "|" + binExp + ")";
string note = "(?:#.*)";
string line = "(?:" + blank + allExp + "?" + blank + note + "?" + "\n?)";
regex pattern(line);
smatch result;
try {
bool compileSuccess = regex_match(data, result, pattern);
}
catch (regex_error e) {
cout << e.what() << "\ncode: " << e.code() << endl;
return false;
}
if (!regex_match(data, result, pattern)) {
printf("ERROR : The format is not correct.\nSyntax is : \n%s\n", syntax.c_str());
return false;
}
vector<int> idxVec;
for (size_t i = 1; i < result.size(); i++) {
if (result[i].str().size() > 0)
idxVec.push_back(i);
}
for (size_t i = 0; i < idxVec.size(); i += 3) {
size_t idx = idxVec[i];
string type = result[idxVec[i]].str();
string varName = result[idxVec[i + 1]].str();
string valueStr = result[idxVec[i + 2]].str();
cout << idxVec.size() << endl;
if (type == "string") {
printf("Config: string %s = \"%s\"\n", varName.c_str(), valueStr.c_str());
strDirectory.Register(varName, valueStr);
}
else if (type == "float") {
istringstream iss(valueStr);
float val;
iss >> val;
printf("Config: float %s = %f\n", varName.c_str(), val);
floatDirectory.Register(varName, val);
}
else if (type == "int") {
istringstream iss(valueStr);
int val;
iss >> val;//数字存到val中了
printf("Config: int %s = %d\n", varName.c_str(), val);
intDirectory.Register(varName, val);
}
regex pattern(line);正则表达式模板
smatch result;实例化匹配器
regex_match(data, result, pattern)确定匹配项
捕获组就是把正则表达式中子表达式匹配的内容,
保存到内存中以数字编号或显式命名的组里,
方便后面引用。当然,这种引用既可以是在正则表达式内部,
也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。
捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。
?:是非捕获组,匹配但不存储
高能:result.size()是包含所有捕获(注意不是非捕获)的包含非空或空,line中blank不是需要的,strexp有三个,如果不满足则到intexp,以此类推
string allExp = "(?:" + strExp + "|" + intExp + "|" + floatExp + "|" + hexExp + "|" + binExp + ")";
str表达式结果在1,2,3
int表达式结果在4,5,6
float 7,8,9
hex 10,11,12
bin 13,14,15
比如我识别bin,除了bin还有4个其他type在bin前边,每个type会有3个捕获,但都为空
最终bin表达式的idx在13,14,15
另外捕获顺序是这样的:
idxVec.size()是捕获中非空的,在这里为3
istringstream是将文本读入,实例化对象iss将内容传递给val中,注意使用的是>>