牛客网:验证IP地址

 这里有两种方法。

目录

1.任务提取

2.正则表达式


1.任务提取

其实无论是ipv4还是ipv6,我们的任务其实都是先分割字符串,然后再判断各个字符串是否合法。

所以,我们首先写一个用某个字符分割字符串的函数。

对于分割后的字符串,要判断是不是ipv4:

1.字符串个数要是4

2.每个字符串要在0-255之间

3.长度大于1的字符串第一位不能是0

要判断是不是ipv6:

1.字符串个数要是8

2.每个字符串中的字符要么是数字,要么是a-f,A-F中的字符

3.每个字符串的长度不能超过4

代码如下所示:

class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    const string IPv6="IPv6";
    const string IPv4="IPv4";
    vector<string> split(string s, string spliter){
        vector<string> res;
        int i;
        while((i=s.find(spliter))&&i!=s.npos){
            res.push_back(s.substr(0,i));
            s=s.substr(i+1);
        }
        res.push_back(s);
        return res;
    }
    bool isIPv4(string &IP){
        vector<string> s=split(IP, ".");
        if(s.size()!=4){
            return false;
        }
        for(int i=0;i<s.size();++i){
            if(s[i].size()==0){
                return false;
            }
            if(s[i].size()>3 || (s[i].size()>0 && s[i][0]=='0')){
                return false;
            }
            for(int j=0;j<s[i].size();++j){
                if(!isdigit(s[i][j])){
                    return false;
                }
            }
            int num=stoi(s[i]);
            if(num<0 || num>255){
                return false;
            }
        }
        return true;
    }
    bool isIPv6(string &IP){
        vector<string> s=split(IP, ":");
        if(s.size()!=8){
            return false;
        }
        for(int i=0;i<s.size();++i){
            if(s[i].size()==0 || s[i].size()>4){
                return false;
            }
            for(int j=0;j<s[i].size();++j){
                if(!(isdigit(s[i][j]) || (s[i][j] >= 'a' && s[i][j] <= 'f') || (s[i][j] >= 'A' && s[i][j] <= 'F')))
                    return false;
            }
        }
        return true;
    }
    
    string solve(string IP) {
        if(IP.size()==0){
            return "Neither";
        }else if(isIPv4(IP)){
            return IPv4;
        }else if(isIPv6(IP)){
            return IPv6;
        }else{
            return "Neither";
        }
    }
};

2.正则表达式

这里的模式可以用正则表达式来进行匹配:

class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    const string IPv6="IPv6";
    const string IPv4="IPv4";
    vector<string> split(string s, string spliter){
        vector<string> res;
        int i;
        while((i=s.find(spliter))&&i!=s.npos){
            res.push_back(s.substr(0,i));
            s=s.substr(i+1);
        }
        res.push_back(s);
        return res;
    }
    bool isIPv4(string &IP){
        vector<string> s=split(IP, ".");
        if(s.size()!=4){
            return false;
        }
        for(int i=0;i<s.size();++i){
            if(s[i].size()==0){
                return false;
            }
            if(s[i].size()>3 || (s[i].size()>0 && s[i][0]=='0')){
                return false;
            }
            for(int j=0;j<s[i].size();++j){
                if(!isdigit(s[i][j])){
                    return false;
                }
            }
            int num=stoi(s[i]);
            if(num<0 || num>255){
                return false;
            }
        }
        return true;
    }
    bool isIPv6(string &IP){
        vector<string> s=split(IP, ":");
        if(s.size()!=8){
            return false;
        }
        for(int i=0;i<s.size();++i){
            if(s[i].size()==0 || s[i].size()>4){
                return false;
            }
            for(int j=0;j<s[i].size();++j){
                if(!(isdigit(s[i][j]) || (s[i][j] >= 'a' && s[i][j] <= 'f') || (s[i][j] >= 'A' && s[i][j] <= 'F')))
                    return false;
            }
        }
        return true;
    }
    
    string solve(string IP) {
        if(IP.size()==0){
            return "Neither";
        }else if(isIPv4(IP)){
            return IPv4;
        }else if(isIPv6(IP)){
            return IPv6;
        }else{
            return "Neither";
        }
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值