1+ // 468. 验证IP地址
2+
3+
4+ /*
5+ 分割校验:
6+ 1、判断是否ipv4
7+ 1)ip长度大于0且尾字符是'.'则返回false
8+ 2)根据'.'分割成数组,注意'.'是转义字符,需要用'\'处理为原字符,'\'也是转义字符所以也要再处理一遍,最终为'\\.'
9+ 3)数组长度不等于4,返回false
10+ 4)子串长度为0或大于3,返回false
11+ 5)子串长度大于1且存在前置0,返回false
12+ 6)子串存在非数字,返回false
13+ 7)子串转化成数字后大于255,返回false
14+ 8)否则返回true
15+ 2、判断是否ipv6
16+ 1)ip长度大于0且尾字符是':'则返回false
17+ 2)根据'.'分割成数组,数组长度不等于8,返回false
18+ 3)子串长度为0或大于4,返回false
19+ 4)子串存在0-9、a-f、A-F以外的字符,返回false
20+ 5)否则返回true
21+ */
22+ class Solution {
23+ public String validIPAddress (String queryIP ) {
24+ if (isValidIPv4 (queryIP )) {
25+ return "IPv4" ;
26+ } else if (isValidIPv6 (queryIP )) {
27+ return "IPv6" ;
28+ } else {
29+ return "Neither" ;
30+ }
31+ }
32+
33+ private boolean isValidIPv4 (String queryIP ) {
34+ if (queryIP .length () > 0 && queryIP .charAt (queryIP .length () - 1 ) == '.' ) {
35+ return false ;
36+ }
37+ String [] array = queryIP .split ("\\ ." );
38+ if (array .length != 4 ) {
39+ return false ;
40+ }
41+ for (String s : array ) {
42+ if (s .length () == 0 || s .length () > 3 ) {
43+ return false ;
44+ }
45+ if (s .length () > 1 && s .charAt (0 ) == '0' ) {
46+ return false ;
47+ }
48+ int num ;
49+ try {
50+ num = Integer .valueOf (s );
51+ } catch (Exception e ) {
52+ return false ;
53+ }
54+ if (num > 255 ) {
55+ return false ;
56+ }
57+ }
58+ return true ;
59+ }
60+
61+ private boolean isValidIPv6 (String queryIP ) {
62+ if (queryIP .length () > 0 && queryIP .charAt (queryIP .length () - 1 ) == ':' ) {
63+ return false ;
64+ }
65+ String [] array = queryIP .split (":" );
66+ if (array .length != 8 ) {
67+ return false ;
68+ }
69+ for (String s : array ) {
70+ if (s .length () == 0 || s .length () > 4 ) {
71+ return false ;
72+ }
73+ if (!s .matches ("[0-9a-fA-F]+" )) {
74+ return false ;
75+ }
76+ }
77+ return true ;
78+ }
79+ }
0 commit comments