C++ 在字符串中获取身份证号

本来自己实现的获取身份证号码很简单,但是考虑到通用型,又重构了一下。

注释不多,但也足够了,代码即注释。

直接上代码,如下:

//验证容器元素是否连续
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)是网上随机获取的,不针对任何人。

猜你喜欢

转载自blog.csdn.net/zhk7894613/article/details/79172460
今日推荐