持续创作,加速成长!这是我参与「掘金日新计划 · 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地址])
需求与分析
验证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";
}
}
三、效果展示
四、总结
大问题分小再分小,就都只是小问题了。
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)