友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

468. 验证IP地址

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 IPv4;如果是有效的 IPv6 地址,返回 IPv6 ;如果不是上述类型的 IP 地址,返回 Neither

有效的IPv4地址x1.x2.x3.x4 形式的IP地址。其中 0 <= xi <= 255xi 不能包含 前导零。例如: 192.168.1.1192.168.1.0 为有效IPv4地址,192.168.01.1 为无效IPv4地址; 192.168.1.00192.168@1.1 为无效IPv4地址。

一个有效的IPv6地址 是一个格式为 x1:x2:x3:x4:x5:x6:x7:x8 的IP地址,其中:

  • 1 <= xi.length <= 4

  • xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母(`af )和大写英文字母( AF )。

  • xi 中允许前导零。

例如 2001:0db8:85a3:0000:0000:8a2e:0370:73342001:db8:85a3:0:0:8A2E:0370:7334 是有效的 IPv6 地址,而 2001:0db8:85a3::8A2E:037j:733402001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的 IPv6 地址。

示例 1:

输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"

示例 2:

输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"

示例 3:

输入:queryIP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址

提示:

  • queryIP 仅由英文字母,数字,字符 .: 组成。

思路分析

字符串操作,规则判断,没意思!

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-08-29 22:41:18
 */
public String validIPAddress(String queryIP) {
  if (queryIP == null || queryIP.isEmpty()) {
    return "Neither";
  }
  if (queryIP.contains(":")) {
    return validIPv6(queryIP);
  } else {
    return validIPv4(queryIP);
  }
}

private String validIPv4(String ip) {
  ip = ip.toLowerCase();
  boolean isValid = true;
  int index = 0;
  int cnt = 0;
  while (index < ip.length()) {
    int end = cnt < 3 ? ip.indexOf(".", index) : ip.length();
    if (end == -1) {
      isValid = false;
      break;
    }
    String part = ip.substring(index, end);
    if ((part.startsWith("0") && part.length() > 1)
      || part.isEmpty()
      || part.length() > 3
      || part.matches(".*[a-z.].*")
      || Integer.parseInt(part) > 255) {
      isValid = false;
      break;
    }
    index = end + 1;
    cnt++;
  }
  return isValid && cnt == 4 ? "IPv4" : "Neither";
}

private String validIPv6(String ip) {
  ip = ip.toLowerCase();
  boolean isValid = true;
  int index = 0;
  int cnt = 0;
  while (index < ip.length()) {
    int end = cnt < 7 ? ip.indexOf(":", index) : ip.length();
    if (end == -1) {
      isValid = false;
      break;
    }
    String part = ip.substring(index, end);
    if (part.isEmpty() || part.length() > 4 || part.matches(".*[g-z.:].*")) {
      isValid = false;
      break;
    }
    index = end + 1;
    cnt++;
  }
  return isValid && cnt == 8 ? "IPv6" : "Neither";
}