验证IP地址

编写一个函数来验证输入的字符串是否是有效的 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";
    } 
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值