import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
public String solve (String IP) {
// write code here
if (isIpv4(IP)) {
return "IPv4";
} else if (isIpv6(IP)) {
return "IPv6";
} else {
return "Neither";
}
}
public boolean isIpv4 (String IP) {
// 注意.在正则表达式里有含义,需要双转义符\\转义
String[] splits = IP.split("\\.", -1);
if (splits.length != 4) {
// 不是4组,不是Ipv4
return false;
}
for (int i = 0; i < 4; i++) {
// 验证每一组
String s = splits[i];
// 1.长度为0
if (s.length() == 0) {
return false;
}
// 2.以0开头
if (s.startsWith("0") && s.length() > 1) {
return false;
}
// 3.存在非数字情况
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
boolean yes = c >= '0' && c <= '9';
if (!yes) {
return false;
}
}
// 4.大小不对
int n = Integer.parseInt(s);
if (n < 0 || n > 255) {
return false;
}
}
return true;
}
public boolean isIpv6 (String IP) {
// 注意!第二个参数为整数,代表最多分这么多组,最后一组包含所有未分的字符串内容
// 第二个参数为0或空,代表尽可能分组,但是连续的符号被视为一个,且忽略最后单独一个
// ":" -> []
// "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334"]
// 第二个参数为负数,代表尽可能分组,且连续符号会出现长度为0的组
// ":" -> ["", ""]
// "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334", ""]
String[] splits = IP.split(":", -1);
if (splits.length != 8) {
// 不是8组,不是Ipv6
return false;
}
for (int i = 0; i < 8; i++) {
// 验证每一组
String s = splits[i];
// 1.0位或超过4位
if (s.length() == 0 || s.length() > 4) {
return false;
}
// 2.出现a-f或A-F外的英文字符
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
boolean yes = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
if (!yes) {
return false;
}
}
}
return true;
}
}