首先说一下应用背景。
传统的来说,我们如果要获取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;
}
关于作者