C++ 获取字符串中的 ID 编号
最编程
2024-05-05 07:43:41
...
本来自己实现的获取身份证号码很简单,但是考虑到通用型,又重构了一下。
注释不多,但也足够了,代码即注释。
直接上代码,如下:
//验证容器元素是否连续
bool IsContuity(vector<int> vec_int)
{
int length = vec_int.size();
if (1 == length)
{
return true;
}
for (int index = 0; index < length - 1; ++index)
{
if (vec_int[index] + 1 != vec_int[index + 1])
{
return false;
}
}
return true;
}
//验证18位身份证号码是否有效
bool IsValidID(const string& str_id)
{
int weight[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char valid_num[] = { '1','0','X','9','8','7','6','5','4','3','2' };
int sum = 0;
int mode = 0;
int length = str_id.length();
if (length == 18)
{
for (int i = 0; i < length - 1; i++)
{
sum = sum + (str_id[i] - '0') * weight[i];
}
mode = sum % 11;
if (valid_num[mode] == str_id[17])
{
return true;
}
}
return false;
}
//获取18位身份证号码
string GetIDNumber(const string& str)
{
int length = str.length();
int count = 0;
vector<int> vec_int;
string str_number;
int index_record = 0;
bool b_first_num = true;
for (int index = 0; index < length; ++index)
{
int n = (int)str[index];//将每一个字符转化为ASCII值
if (n >= 48 && n <= 57 || n == 120 || n == 88)
{
++count;
vec_int.push_back(index);
str_number += str[index];
if (!IsContuity(vec_int))
{
count = 0;
b_first_num = true;
vec_int.clear();
str_number.clear();
continue;
}
if (b_first_num)
{
index_record = index;
b_first_num = false;
}
if (count == 18 && vec_int.size() == 18)
{
if (IsValidID(str_number))
{
return str_number;
break;
}
else
{
count = 0;
index = index_record;
b_first_num = true;
vec_int.clear();
str_number.clear();
}
}
}
}
return "";
}
int main()
{
string str = ":的手机费dsf,s的技;术的。积分i【】s地方dfsd951018219911022842X52X01258656fjodjfsodifs胜多负少的法律手段";
auto id_number = GetIDNumber(str);
cout << id_number << endl;
system("pause");
return 0;
}
运行结果如下:
注:身份证号码(51018219911022842X)是网上随机获取的,不针对任何人。