(字符串)03-验证IP地址

发布时间 2023-11-24 22:53:26作者: StringBuilder

  1 import java.util.*;
  2 
  3 public class Solution {
  4     /**
  5      * 验证IP地址
  6      * @param IP string字符串 一个IP地址字符串
  7      * @return string字符串
  8      */
  9     public String solve (String IP) {
 10         if (isIPv4(IP)) {
 11             return "IPv4";
 12         } else if (isIPv6(IP)) {
 13             return "IPv6";
 14         }
 15         return "Neither";
 16     }
 17 
 18     boolean isIPv4 (String ip) {
 19         // 分割字符串
 20         if (ip.indexOf('.') == -1) {
 21             return false;
 22         }
 23         String[] itemArray = ip.split("\\.");
 24         // 校验组数量
 25         if (itemArray.length != 4) {
 26             return false;
 27         }
 28         for (int i = 0; i < itemArray.length; i++) {
 29             // 不能缺省
 30             if (itemArray[i].length() < 0 || itemArray[i].length() == 0) {
 31                 return false;
 32             }
 33             // 不能大于255
 34             if (itemArray[i].length() > 3) {
 35                 return false;
 36             }
 37             // 不能以0开头
 38             if (itemArray[i].charAt(0) == '0' && itemArray[i].length() != 1) {
 39                 return false;
 40             }
 41             // 分割字符串每个字符必须为数字
 42             for (int j = 0; j < itemArray[i].length(); j++) {
 43                 char word = itemArray[i].charAt(j);
 44                 if (word < '0' || word > '9') {
 45                     return false;
 46                 }
 47             }
 48             // 转化为数字需要在0-255之间
 49             int num = 0;
 50             for (int j = 0; j < itemArray[i].length(); j++) {
 51                 char word = itemArray[i].charAt(j);
 52                 num = num * 10 + (int)(word - '0');
 53             }
 54             if (num < 0 || num > 255) {
 55                 return false;
 56             }
 57         }
 58         return true;
 59     }
 60 
 61     boolean isIPv6 (String ip) {
 62         // 分割字符串
 63         if (ip.indexOf(':') == -1) {
 64             return false;
 65         }
 66         String[] itemArray = ip.split(":");
 67         // 校验组数量
 68         if (itemArray.length != 8) {
 69             return false;
 70         }
 71         // 不能以冒号开始或结尾
 72         if (ip.startsWith(":") || ip.endsWith(":")) {
 73             return false;
 74         }
 75         for (int i = 0; i < itemArray.length; i++) {
 76             // 每组字符串不能缺省
 77             if (itemArray[i].length() == 0) {
 78                 return false;
 79             }
 80             // 每组字符串不能超过4位
 81             if (itemArray[i].length() > 4) {
 82                 return false;
 83             }
 84             // 每组字符串不能只有0
 85             int zeroCount = 0;
 86             for (int j = 0; j < itemArray[i].length(); j++) {
 87                 char word = itemArray[i].charAt(j);
 88                 if (word == '0') {
 89                     zeroCount ++;
 90                 }
 91             }
 92             if (itemArray[i].charAt(0) == 0 &&
 93                     itemArray[i].length() > 1 &&
 94                     zeroCount == itemArray[i].length()) {
 95                 return false;
 96             }
 97             // 不能出现[0-9][a-f][A-F]以外的字符
 98             for (int j = 0; j < itemArray[i].length(); j++) {
 99                 char word = itemArray[i].charAt(j);
100                 boolean flag = (word >= '0' && word <= '9') ||
101                                (word >= 'a' && word <= 'f') ||
102                                (word >= 'A' && word <= 'F') ;
103                 if (flag == false) {
104                     return false;
105                 }
106             }
107         }
108         return true;
109     }
110 }