【正则表达式 ip地址验证 】java版本 ip地址的正则表达式 验证前端传输过来的ip地址数据内容格式是否正确

起因

在今天写后端的时候因为要在后端对前端传输过来的ip地址内容进行验证,所以就有了这篇文章

首先ipv4的ip地址的写法规则为 xxx.xxx.xxx.xxx
且每一个xxx的范围为 0-255

最终优化出来用于匹配ip地址的正则表达式版本提示:

((2(5[0-5]|[0-4]\d))|((1\d{2})|[1-9]\d|[0-9]))(\.((2(5[0-5]|[0-4]\d))|((1\d{1,2})|[1-9]\d|[0-9]))){3}
优化后用于判断一个ip地址字符串是否满足规则 可直接跳转到 “再优化”板块查看函数

java ip验证方法

下方为通过java实现对输入的ip地址的验证:
函数返回值:
0:ip地址不符合它的规则
1:符合ip地址规则

下面这个函数是自己想的时候写的,功能虽然能实现 但是过程还是比较粗糙,没那么精致

private int judgeIP(String ip){
        String[] result = ip.split("\\.");
        //ip地址由"."分为四段
        int standardLen = 4;
        if(result.length != standardLen){
            return 0;
        }
        else{
            //能由"."分为四段
            for (String temp:result) {
                //遍历判断
                /*判断是否为非0开头的 整数*/
                if(temp.matches("0|[1-9][0-9]*")){
                    int tempInt = Integer.valueOf(temp);
                    if(tempInt > 255||tempInt <0){
                        //是数字  但是取值范围不对 0 -255
                        return 0;
                    }
                    //符合规范就继续验证下一个 直到四个都验证完
                }
                else{
                    //不是数字的  或者字符串0开头的 正则匹配失败
                    return 0;
                }
            }
            //遍历完所有ip 完全符合规范的
            return 1;
        }
    }

函数分析:

大致过程是将输入的ip地址字符串根据 "."分为四段 先将不符合这一基本规则的字符串给筛选出去,然后判断每一段是否在0-255的范围内 这儿使用了正则表达式

正则分析:

所使用到的正则为:0|[1-9][0-9]*
其表达的含义为:0 和 非0开头的正整数 [0-9]*表示前面是1-9开头的数字 后面的数字0-9
所以[1-9][0-9]*
所表示的数的范围为:1-无限大 至于到255的范围 后面单独判断
这儿不包含0所以0要单独写

优化:

因为ip是0-255 故可以完全将ip地址的匹配交给正则表达式:
((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

该正则表达式来自 菜鸟正则表达式在线测试的页尾

优化(正则表达式)解读:

首先上面这个正则表达式可以拆分为两个部分:
((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})

(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
两个部分

分别对其进行解读:

第一部分:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2}):该段为匹配xxx.xxx.xxx.xxx 的第一段红色部分(不含 “.” )
“|” 将它们分开 然后左右分别表示
(2(5[0-5]|[0-4]\d)) : 200-255
[0-1]?\d{1,2}:0-199
总的范围表示为:0-255

第二部分: (\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}为了匹配xxx.xxx.xxx.xxx 后面三个部分(包含 ‘.’ )

这部分和前面的有些相似 在{ }里面作用是用于控制前面匹配的次数

测试记录:
在这里插入图片描述
上图为用上面的正则表达式对输入的一些ip案例进行了验证 能够匹配去除掉大部分错误案例

数字不在0-255的范围内的,不符合ip地址规范(四位0-255组成,且由
进行分开)

但是仍有一部分问题 那就是像匹配到的第一个和第4个这种0开头的给去除(但这个位置可能为0 不能去除0这个单独的数字 但也不能是由0开头的一个数字(不符合整数的组成规则))

再优化 (最终函数)

优化结果:
((2(5[0-5]|[0-4]\d))|((1\d{2})|[1-9]\d|[0-9]))(\.((2(5[0-5]|[0-4]\d))|((1\d{1,2})|[1-9]\d|[0-9]))){3}
在这里插入图片描述
该正则表达式能够去除中间为0 的情况,相比上一个版本更加的准确

在idea中创建了一个application 然后去运行这个函数

修改后的方法 最终版(判断是否满足规则(能否有匹配值) 或 (代码中注释内容)遍历匹配到的内容)
private static String judgeIP2(String ip){

        String zz_rules = "((2(5[0-5]|[0-4]\\d))|((1\\d{2})|[1-9]\\d|[0-9]))(\\.((2(5[0-5]|[0-4]\\d))|((1\\d{1,2})|[1-9]\\d|[0-9]))){3}";
          
       /* 该段注释 遍历匹配到的所有值  结果
       Pattern p = Pattern.compile(zz_rules);
        List<String> result = new ArrayList<>();
        Matcher m = p.matcher(ip);//进行匹配
        while (m.find()) {//判断正则表达式是否匹配到
            String part = m.group();//通过group来获取每个分组的值,group(0)代表正则表达式匹配到的所有内容,1代表第一个分组
            result.add(part);
            System.out.println(result);
        }
*/
        //"字符串".matches(String)  的返回值是一个boolean 值 只能作为判断是否有匹配的字段
        if(ip.matches(zz_rules)){
            return "匹配到了结果";
        }
        else {
            return "无匹配字段";
        }
//        return "测试";
    }

在改写正则表达式的过程中发现一个匹配过程中存在的贪婪问题:单独开一篇文章来说明这个问题

参考内容:

菜鸟正则表达式语法:https://www.runoob.com/regexp/regexp-syntax.html
菜鸟工具:https://c.runoob.com/front-end/854/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿,葱来了-C is coming

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值