侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 26 条评论

目 录CONTENT

文章目录

【模拟, 正则】验证IP地址

GabrielxD
2022-05-29 / 0 评论 / 0 点赞 / 237 阅读 / 820 字
温馨提示:
本文最后更新于 2022-07-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

468. 验证IP地址


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

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

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

  • 1 <= xi.length <= 4
  • xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a''f' )和大写英文字母( 'A''F' )。
  • xi 中允许前导零。

例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334""2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334""02001: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 仅由英文字母,数字,字符 '.'':' 组成。

解题

方法一:模拟 分类讨论

思路

根据题意模拟即可。

代码

class Solution {
    public String validIPAddress(String queryIP) {
        if (queryIP.startsWith(".") || queryIP.endsWith(".") ||
            queryIP.startsWith(":") || queryIP.endsWith(":")) return "Neither";
        String[] strArr = queryIP.split("\\.");
        if (strArr.length == 4) {
            for (String str : strArr) {
                if (str.length() == 0 || str.length() > 3 ||
                    str.length() != 1 && str.startsWith("0")) return "Neither";
                for (char ch : str.toCharArray()) {
                    if (ch < '0' || ch > '9') return "Neither";
                }
                int num = Integer.parseInt(str);
                if (num < 0 || num > 255) return "Neither";
            }
            return "IPv4";
        }
        strArr = queryIP.split(":");
        if (strArr.length == 8) {
            for (String str : strArr) {
                int len = str.length();
                if (len < 1 || len > 4) return "Neither";
                for (char ch : str.toCharArray()) {
                    if (ch < '0' || ch > '9' && ch < 'A' ||
                        ch > 'F' && ch < 'a' || ch > 'f') return "Neither";
                }
            }
            return "IPv6"; 
        }
        return "Neither";
    }
}

需要注意的测试案例:

"2001:0db8:85a3:0:0:8A2E:0370:7334:"
"1e1.4.5.6"
"12..33.4"
"20EE:FGb8:85a3:0:0:8A2E:0370:7334"
"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"

方法一:正则表达式

思路

根据题意模拟即可。

代码

import java.util.regex.Matcher;  
import java.util.regex.Pattern;

class Solution {
    private String ipv4Num = "([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])";
    private String ipv4Regex = ipv4Num + "(\\." + ipv4Num + "){3}";
    private String ipv6Num = "[0-9|A-F|a-f]{1,4}";
    private String ipv6Regex = ipv6Num + "(:" + ipv6Num + "){7}";

    public String validIPAddress(String queryIP) {
        Pattern p1 = Pattern.compile(ipv4Regex);  
        Matcher m1 = p1.matcher(queryIP);
        if (m1.matches()) return "IPv4";
        Pattern p2 = Pattern.compile(ipv6Regex);
        Matcher m2 = p2.matcher(queryIP);
        if (m2.matches()) return "IPv6";
        return "Neither";
    }
}
0

评论区