给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “[email protected]” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:
1 <= xi.length <= 4
xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
在 xi 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。
示例 1:
输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"
var validIPAddress = function(queryIP) {
const n = queryIP.length, isIPv4 = queryIP.includes('.')
let x = 0
for (let i = 0, s = ''; i <= n; i++) {
const c = queryIP[i]
if (i === n || isIPv4 && c === '.' || c === ':') {
if (s === '' || isIPv4 && s > 255 || s.length > 4) return 'Neither'
x++
s = ''
} else if (c >= 0 && c <= 9 || isIPv4 === false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
if (isIPv4 && s === '0' || s.length === 4) return 'Neither'
s += c
} else return 'Neither'
}
return x === 4 ? 'IPv4' : x === 8 ? 'IPv6' : 'Neither'
};
function validIPAddress(queryIP: string): string {
const n = queryIP.length, isIPv4 = queryIP.includes('.')
let x = 0
for (let i = 0, s = ''; i <= n; i++) {
const c = queryIP[i]
if (i === n || isIPv4 && c === '.' || c === ':') {
if (s === '' || isIPv4 && s > '255' || s.length > 4) return 'Neither'
x++
s = ''
} else if (c >= '0' && c <= '9' || isIPv4 === false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
if (isIPv4 && s === '0' || s.length === 4) return 'Neither'
s += c
} else return 'Neither'
}
return x === 4 ? 'IPv4' : x === 8 ? 'IPv6' : 'Neither'
};
class Solution {
function validIPAddress($queryIP) {
$n = strlen($queryIP);
$isIPv4 = strpos($queryIP, '.') > 0;
$x = 0;
$s = '';
for ($i = 0; $i <= $n; $i++) {
$c = $queryIP[$i];
if ($i === $n || $isIPv4 && $c === '.' || $c === ':') {
if ($s === '' || $isIPv4 && $s > 255 || strlen($s) > 4) return 'Neither';
$x++;
$s = '';
} else if ($c >= 0 && $c <= 9 || $isIPv4 === false && ($c >= 'a' && $c <= 'f' || $c >= 'A' && $c <= 'F')) {
if ($isIPv4 && $s === '0' || strlen($s) === 4) return 'Neither';
$s .= $c;
} else return 'Neither';
}
return $x === 4 ? 'IPv4' : ($x === 8 ? 'IPv6' : 'Neither');
}
}
func validIPAddress(queryIP string) string {
n, isIPv4, x, s := len(queryIP), strings.Contains(queryIP, "."), 0, &strings.Builder{}
for i := 0; i <= n; i++ {
if i == n || isIPv4 && queryIP[i] == '.' || queryIP[i] == ':' {
if s.Len() == 0 || isIPv4 && s.String() > "255" || s.Len() > 4 {
return "Neither"
}
x++
s.Reset()
} else if queryIP[i] >= '0' && queryIP[i] <= '9' || isIPv4 == false && (queryIP[i] >= 'a' && queryIP[i] <= 'f' || queryIP[i] >= 'A' && queryIP[i] <= 'F') {
if isIPv4 && s.String() == "0" || s.Len() == 4 {
return "Neither"
}
s.WriteByte(queryIP[i])
} else {
return "Neither"
}
}
if x == 4 {
return "IPv4"
} else if x == 8 {
return "IPv6"
} else {
return "Neither"
}
}
class Solution:
def validIPAddress(self, queryIP: str) -> str:
n, isIPv4, x, s = len(queryIP), '.' in queryIP, 0, ''
for i in range(0, n + 1):
c = '' if i == n else queryIP[i]
if i == n or isIPv4 and c == '.' or c == ':':
if s == '' or isIPv4 and s > '255' or len(s) > 4: return 'Neither'
x += 1
s = ''
elif c >= '0' and c <= '9' or isIPv4 == False and (c >= 'a' and c <= 'f' or c >= 'A' and c <= 'F'):
if isIPv4 and s == '0' or len(s) == 4: return 'Neither'
s += c
else: return 'Neither'
if x == 4: return 'IPv4'
if x == 8: return 'IPv6'
return 'Neither'
class Solution {
public String validIPAddress(String queryIP) {
int n = queryIP.length();
boolean isIPv4 = queryIP.contains(".");
String s = "";
int x = 0;
for (int i = 0; i <= n; i++) {
char c = i == n ? Character.MIN_VALUE : queryIP.charAt(i);
if (i == n || isIPv4 && c == '.' || c == ':') {
if (s == "" || isIPv4 && Integer.valueOf(s) > 255 || s.length() > 4) return "Neither";
x++;
s = "";
} else if (c >= '0' && c <= '9' || isIPv4 == false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
if (isIPv4 && s.equals("0") == true || s.length() == 4) return "Neither";
s += c;
} else return "Neither";
}
return x == 4 ? "IPv4" : x == 8 ? "IPv6" : "Neither";
}
}
var validIPAddress = function(queryIP) {
return /^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/.test(queryIP) ? 'IPv4' : /^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/.test(queryIP) ? 'IPv6' : 'Neither'
};
function validIPAddress(queryIP: string): string {
return /^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/.test(queryIP) ? 'IPv4' :
/^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/.test(queryIP) ? 'IPv6' : 'Neither'
};
class Solution {
function validIPAddress($queryIP) {
return preg_match('/^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/', $queryIP) > 0 ? 'IPv4' : (
preg_match('/^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/', $queryIP) > 0 ? 'IPv6' : 'Neither'
);
}
}
class Solution:
def validIPAddress(self, queryIP: str) -> str:
if re.match('^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$', queryIP): return 'IPv4'
if re.match('^([0-9a-fA-F]{1,4}($|:(?!$))){8}$', queryIP): return 'IPv6'
return 'Neither'
class Solution {
public String validIPAddress(String queryIP) {
return queryIP.matches("^((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)($|\\.(?!$))){4}$") ? "IPv4" : queryIP.matches("^([0-9a-fA-F]{1,4}($|:(?!$))){8}$") ? "IPv6" : "Neither";
}
}