【JAVA】【刷题子】468. 验证IP地址

536 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

一、题目、需求与分析

题目

  给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
  有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “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 中允许前导零。
    (题目来源:力扣 468. 验证IP地址]) image.png

需求与分析

  验证IP地址,题目中有两种形式,一种是IPv4,另一种是IPv6。首先我们要清楚IPv4的格式和范围,也就是0.0.0.0 ~ 255.255.255.255(这个范围内) 我们再把需求剖析,以看到每个小数点.分隔开来,就是会有4个数值;我们只需要匹配这些数值的范围即可,因为这4个数值的取值范围都是一样(0 ~ 255);
  所以,我们单独对1个数分析,对应的取值就可能是一位整数(0 ~ 9),两位整数(10 ~ 99),三位整数(100 ~ 255).
  同理,分析IPv6也是一样,取值范围是
0000:0000:0000:0000:0000:0000:0000:0000 ~ FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
单独1个数值分析,就是(0000 ~ FFFF);取值一位整数(0 ~ F),两位整数(00 ~ FF),三位整数(000 ~ FFF),四位整数(0000 ~ FFFF)...
  好了,那么问题就简单化了,正则匹配也就简单化了~

二、整体逻辑与主要代码

整体逻辑

IPv4的分析
上面已经分析了IPv4对应的是4个数值的取值范围,并且取值范围也都一样。
  IPv4取值范围:一位整数(0 ~ 9),两位整数(10 ~ 99),三位整数(100 ~ 255
  ∴ 一位整数正则:[0-9]
  ∴ 两位整数正则:[1-9][0-9]
  ∴ 三位整数正则:1[0-9][0-9](100 ~ 199的范围)+ 2[0-4][0-9]|25[0-5](200 ~ 255的范围).
  那么,匹配IPv4的正则就是可能取值的情况加起来,同时加上小数点,就完成了。也就是:

// 4个数值的其中1个数值取值范围
String regexIPv4 = "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
// 加上IPv4的格式(小数点),加上剩余的3个数值取值范围
regexIPv4 += "(\\." + regexIPv4 + "){3}"; 


IPv6的分析
同理,IPv6取值范围:一位整数(0 ~ F),两位整数(00 ~ FF),三位整数(000 ~ FFF),四位整数(0000 ~ FFFF
  一位整数正则:[0-9a-fA-F]{1}
  两位整数正则:[0-9a-fA-F]{2}
  三位整数正则:[0-9a-fA-F]{3}
  四位整数正则:[0-9a-fA-F]{4}

// 8个个数值的其中1个数值取值范围
String regexIPv6 = "([0-9a-fA-F]{1,4})";
// 加上IPv6的格式(英文冒号),加上剩余的7个数值取值范围
regexIPv6 += "(:" + regexIPv6 + "){7}";

主要代码

搞定了正则,这下题就完全简单了~ 直接上代码吧!
(如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

class Solution {
	public String validIPAddress(String queryIP) {
		// 不能为空
		if (queryIP == null) {
			return "Neither";
		}
		// IPv4其中1个数值的正则
		String regexIPv4 = "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
		// IPv4完整的正则
		regexIPv4 += "(\\." + regexIPv4 + "){3}";
		// IPv6其中1个数值的正则
		String regexIPv6 = "([0-9a-fA-F]{1,4})";
		// IPv6完整的正则
		regexIPv6 += "(:" + regexIPv6 + "){7}";
		if (queryIP.matches(regexIPv4)) {
			return "IPv4";
		} else if (queryIP.matches(regexIPv6)) {
			return "IPv6";
		}
		return "Neither";
	}
}

三、效果展示

image.png

四、总结

大问题分小再分小,就都只是小问题了。

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)