编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以,2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (:😃 的情况。 比如,2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如,02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
方法1:遍历(推荐)
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
if(isIpv4(IP))
{
return "IPv4";
}
else if(isIPv6(IP))
{
return "IPv6";
}
else return "Neither";
}
private:
void MySplit(string str,char split,vector<string> &vecRes)
{
string temp;
str = str + split;//处理最后一组数据
for(int i = 0; i < str.size(); i++)
{
if(str[i] != split)
{
temp += str[i];
}
else if(str[i] == split)
{
vecRes.push_back(temp);
temp.clear();
}
}
}
bool isIpv4(string IP)
{
if(IP.find('.') == IP.npos)
{
return false;
}
else
{
vector<string> vec_IPV4;
MySplit(IP, '.', vec_IPV4);
if(vec_IPV4.size() != 4)
{
return false;
}
for(int i = 0;i < 4;i++)
{
if(vec_IPV4[i].size() == 0)
{
return false;
}
// 判断每一组数的位数,以及以0开始的数(011.9)
else if(vec_IPV4[i].size() > 3 || vec_IPV4[i][0] == '0')
{
return false;
}
// 判断每一位有效
for(int j = 0;j<vec_IPV4[i].size();j++)
{
if(vec_IPV4[i][j] < '0' || vec_IPV4[i][j] > '9')
{
return false;
}
}
// 判断在0-255内
if(stoi(vec_IPV4[i]) < 0 || stoi(vec_IPV4[i]) > 255)
{
return false;
}
}
}
return true;
}
bool isIPv6(string IP)
{
if(IP.find(':') == IP.npos)
{
return false;
}
vector<string> vec_IPV6;
MySplit(IP, ':', vec_IPV6);
if(vec_IPV6.size() != 8)
{
return false;
}
else
{
for(int i = 0; i < 8;i++)
{
if(vec_IPV6[i].size() == 0 || vec_IPV6[i].size() > 4)
{
return false;
}
for(int j = 0; j < vec_IPV6[i].size();j++)
{
if(!((vec_IPV6[i][j] >= 'a' && vec_IPV6[i][j] <= 'f') || (vec_IPV6[i][j] >= 'A' && vec_IPV6[i][j] <= 'F') || (vec_IPV6[i][j] >= '0' && vec_IPV6[i][j] <= '9')))
{
return false;
}
}
}
}
return true;
}
};
方法2:正则
#include<regex>
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
//正则表达式限制0-255 且没有前缀0 四组齐全
regex ipv4("(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])");
//正则表达式限制出现8组,0-9a-fA-F的数,个数必须是1-4个
regex ipv6("([0-9a-fA-F]{1,4}\\:){7}[0-9a-fA-F]{1,4}");
//调用正则匹配函数
if (regex_match(IP, ipv4))
return "IPv4";
else if (regex_match(IP, ipv6))
return "IPv6";
else return "Neither";
}
};