c++ 正则表达式之差点过不去的坎

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中,注意使用的是>>

猜你喜欢

转载自blog.csdn.net/qq_41598072/article/details/84994911