通过清心醉

c++实现字符的模糊匹配,从string类型文字中提取数字

首先说一下应用背景。

传统的来说,我们如果要获取string里面的数字,直接过滤掉字符提取数字就可以了。但是因为需要进行检索其他的文字条件。比如检查一个字符串“清心醉888”,如果只是for循环string.length(),就不知道是不是要检索的了。这样的话我们可以设置一个心醉,或者清心,来提取对应的数值。上代码

#include<iostream>
#include<vector>
#include<string>

using namespace std;
//字符串分割数组
vector<string> split(const string& s, const string& seperator) {
	vector<string> result;
	typedef string::size_type;
	int i = 0;

	while (i != s.size()) {
		//找到字符串中首个不等于分隔符的字母;
		int flag = 0;
		while (i != s.size() && flag == 0) {
			flag = 1;
			for (int x = 0; x < seperator.size(); ++x)
				if (s[i] == seperator[x]) {
					++i;
					flag = 0;
					break;
				}
		}

		//找到又一个分隔符,将两个分隔符之间的字符串取出;
		flag = 0;
		int j = i;
		while (j != s.size() && flag == 0) {
			for (int x = 0; x < seperator.size(); ++x)
				if (s[j] == seperator[x]) {
					flag = 1;
					break;
				}
			if (flag == 0)
				++j;
		}
		if (i != j) {
			result.push_back(s.substr(i, j - i));
			i = j;
		}
	}
	return result;
}
//替换字符串
std::string subreplace(std::string resource_str, std::string sub_str, std::string new_str)
{
	std::string dst_str = resource_str;
	std::string::size_type pos = 0;
	while ((pos = dst_str.find(sub_str)) != std::string::npos)   //替换所有指定子串
	{
		dst_str.replace(pos, sub_str.length(), new_str);
	}
	return dst_str;
}
int getValue(string result) {
	string str;
	int value;
	for (int i = 0; i < result.length(); i++) {
		switch (result[i]) {
			case '1':	str += "1"; break;
			case '2':	str += "2"; break;
			case '3':	str += "3"; break;
			case '4':	str += "4"; break;
			case '5':	str += "5"; break;
			case '6':	str += "6"; break;
			case '7':	str += "7"; break;
			case '8':	str += "8"; break;
			case '9':	str += "9"; break;
			case '0':	str += "0"; break;
			default:				//直接返回是可以避免文字带数字又带文字数字,如果需要提取多个数据,需要做成数组
				if (str.length() > 0) {
					value = stoi(str);
					return value;
				}
				break;
		}
	}
	if (str.length() > 0) {
		value = stoi(str);
		return value;
	}
	return -1;
}
//这是最笨的也是最快的方法,无需匹配
int  getStringIntValue(string result,string str) {
	int value = -1;
	//str的格式:str = "1%匹配内容1,匹配的内容%2";
	vector<string>Array = split(str, ","); //先拆分成数组
	//因为需要匹配的是二维数据
	for (int i = 0; i < Array.size(); i++) { //遍历1维
		vector<string>arr = split(Array[i], "%");
		int state = 0;
		for (int k = 0; k < arr.size(); k++) {
			if (result.find(arr[k]) == result.npos) { //查找内容
				continue;
			}
			else {
				state++;
			}
		}
		if (state + 1 == arr.size()) {
			value = getValue(result); //整个字符串给过去
			if (value > 0) {
				//cout << "匹配成功" << endl;
				return value;
			}			
		}
	}
	return -1;
}

int main()
{
	string result, str;

	int val;
	result = "包含中文789789后面是文字"; //必须匹配%成数组之后的匹配
	str = "1%后面";
	cout << "第1种检测:只匹配后面" << endl;
	val = getStringIntValue(result, str);
	cout << val << endl;

	result = "包含中文888888后面是文字"; //必须匹配%成数组之后的匹配
	str = "中文%1";
	cout << "第2种检测:只匹配前面" << endl;
	val = getStringIntValue(result, str);
	cout << val << endl;

	result = "包含中文999999后面是文字"; //必须匹配%成数组之后的匹配
	str = "中文%1%后面";
	cout << "第3种检测:匹配前后" << endl;
	val = getStringIntValue(result, str);
	cout << val << endl;


	result = "包含中文2589456后面是文字"; //必须匹配%成数组之后的匹配
	str = "中%1%啊"; //这里【文字%1%中文】的内容,只要出现在字符串里就认为是有效.但是如果写成%1%也是可以的
	//一定不能为空,不然检测时肯定生效的
	cout << "第4种检测:随意匹配必定失败,文字有不存在的" << endl;
	val = getStringIntValue(result, str);
	cout << val << endl;

	result = "包含中文2589456后面是文字不管你文字有多长,我都要识别。"; //必须匹配%成数组之后的匹配
	str = "中%1%都要"; //这里【文字%1%中文】的内容,只要出现在字符串里就认为是有效.但是如果写成%1%也是可以的
	//一定不能为空,不然检测时肯定生效的
	cout << "第5种检测:随意匹配必定成功" << endl;
	val = getStringIntValue(result, str);
	cout << val << endl;
}

关于作者

清心醉 administrator

发表评论

请输入验证码: