这里有两种方法。
目录
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";
}
}
};