入力文字列が有効な IPv4 または IPv6 アドレスであることを確認する関数を作成します。
IPv4 アドレスは10 進数とドットで表され、各アドレスには0 から 255 までの 4 つの 10 進数が (".") で区切られて含まれます。たとえば、172.16.254.1;
同時に、IPv4 アドレスの数字は 0 から始まりません。たとえば、アドレス 172.16.254.01 は不正です。
IPv6 アドレスは16 進数の 8 つのグループで表され、各グループは 16 ビットを表します。これらの数字のグループは (":") で区切られます。たとえば、2001:0db8:85a3:0000:0000:8a2e:0370:7334 は有効なアドレスです。さらに、0 で始まるいくつかの数字を追加することができ、文字は大文字または小文字にすることができます。したがって、2001:db8:85a3:0:0:8A2E:0370:7334 も有効な IPv6 アドレスです (つまり、先頭の 0 を無視し、大文字と小文字を区別しません)。
ただし、グループの値が 0 であるため、空のグループを使用することはできず、(::) 状況が発生します。たとえば、2001:0db8:85a3::8A2E:0370:7334 は無効な IPv6 アドレスです。同時に、IPv6 アドレスでは冗長な 0 は許可されません。たとえば、02001:0db8:85a3:0000:0000:8a2e:0370:7334 は無効です。
説明: 指定されたストリングにスペースやその他の特殊文字が含まれていないと想定できます。
例 1:
入力: 「172.16.254.1」
出力: 「IPv4」
説明: これは有効な IPv4 アドレスであるため、「IPv4」が返されます。
例 2:入力: "2001:0db8:85a3:0:0:8A2E:0370:7334"
出力: 「IPv6」
説明: これは有効な IPv6 アドレスであるため、「IPv6」が返されます。
例 3:入力: 「256.256.256.256」
出力: 「どちらでもない」
説明: このアドレスは、IPv4 アドレスでも IPv6 アドレスでもありません。
テストは、詳細を理解し、処理する能力です。468. IP アドレスの確認 - LeetCode
IPv4 の判定では、IPv4 の異なる部分が「.」で区切られ、IPv4 の異なるセグメントがインターセプトされ、これらの異なる部分の判定が行われます。
先頭に 0 を付けることはできません
空にすることはできません
整数に変換することはできません 255 を超えることはでき
ません 4 つの段落のみを含める
ことができます 他の文字を含めることはできません
IPv6の判定:
空にすることはできません、
パーツのサイズを 4 より大きくすることはできません、
セグメントは 8 つしか使用できませ
ん 、その他の文字は使用できません
大文字と小文字の範囲に 'a'~'f' がさらにあります オプション
コードは Leetcode からのものです
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
public class Main{
public static void main (String[] args) {
Scanner in = new Scanner(System.in);
String input_str=in.nextLine();
System.out.println(validIPAddress(input_str));
return;
}
public static String validIPAddress(String queryIP) {
if (queryIP.indexOf('.') >= 0) {
return isIpV4(queryIP) ? "IPv4" : "Neither";
} else {
return isIpV6(queryIP) ? "IPv6" : "Neither";
}
}
public static boolean isIpV4(String queryIP) {
//加-1是防止出现空字符串无法计数 比如192.168.1.1. 后边多了一个点,不加-1会被忽略后边的空串
String[] split = queryIP.split("\\.",-1);
//个数不是4个
if (split.length != 4) {
return false;
}
for (String s : split) {
//每个长度不在 1-3之间
if (s.length() > 3 || s.length() == 0) {
return false;
}
//有前导0 并且长度不为1
if (s.charAt(0) == '0' && s.length() != 1) {
return false;
}
//计算数字
int ans = 0;
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
//不是数字
if (!Character.isDigit(c)) {
return false;
}
ans = ans * 10 + (c - '0');
}
//数字超过255
if (ans > 255) {
return false;
}
}
return true;
}
public static boolean isIpV6(String queryIP) {
String[] split = queryIP.split(":",-1);
//数量不是8个
if (split.length != 8) {
return false;
}
for (String s : split) {
//每个串 长度不在1-4之间
if (s.length() > 4 || s.length() == 0) {
return false;
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//不是数字并且字母不在 a-f之间
if (!Character.isDigit(c) && !(Character.toLowerCase(c) >= 'a') || !(Character.toLowerCase(c) <= 'f')) {
return false;
}
}
}
return true;
}
}