题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
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; } }