最近在学习java,研究一些算法,找些联系题,自己去下手试试。这里记录下学习历程,也增强自己的记忆。初学者,见笑了。从开始判断一个字符串是不是正规ipv4的地址开始练习吧,初步代码如下:

public class isIpv4{
    

     public String cutblank(String str){

            //如果字符串前有空格
            while(str.startsWith(""))
            {
            str=  str.substring(1,str.length()).trim();
            
            }
            //去掉字符串后的空格
            while(str.endsWith(""))
            {
            str= str.substring(0,str.length()-1).trim();
            System.out.println(str);
            }
            return str;

           }

            
            public boolean isipv4(String ip){
            //判断是否是一个ip地址
            boolean a=false;
            ip = this.cutblank(ip);
            boolean flag =ip.matches("\\d{1,3}\\.d{1,3}\\.d{1,3}\\.d{1,3}");
            if(flag)
            {
            String s[] = ip.split("\\.");
            int i1= Integer.parseInt(s[0]);
            int i2= Integer.parseInt(s[1]);
            System.out.println(i2);
            int i3= Integer.parseInt(s[2]);
            int i4= Integer.parseInt(s[3]);
            if(i1>0&&i1<256&&i2<256&&i3<256&&i4<256)
                a = true;

            }
            return a;
         }
            
            public static void main(String[] args) throws Exception {
                    String s= " 122.005.133.244 ";
                    isIpv4 isip = new isIpv4();
                    boolean check = isip.isipv4(s);
                    System.out.println(check);
                    System.out.println(check? "是一个常规ipv4地址" : "不是一个ip地址");

                }


}


运行第一次的时候出错:

wKioL1lsej6wF6TcAAB4ot17ZQk630.jpg-wh_50

调试了半天,问题还是差不出来,干脆屏蔽这块空白字符处理的代码继续


屏蔽掉字符处理后还是报错,各种打印值后发现正则写的有点问题

更正:

        boolean flag =ip.matches("\\d{1,3}\\.d{1,3}\\.d{1,3}\\.d{1,3}");

更正后继续运行调试,终于打印出结果,没有报错信息了

小小高兴下,继续吧

继续打开字符处理屏蔽找出字符越界的问题,一直没查出报错原因,这里留一个坑。后来想想,我只是要减去空格啊,为啥只处理头尾呢,不如直接trim()了啊,现成的api啊。这里被自己的笨到了

继续改了:

public class isIpv4{
    
            
            public boolean isipv4(String ip){
            //判断是否是一个ip地址
            boolean a=false;
            ip = cutblank(ip);
            boolean flag =ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
         
            if(flag)
            {
            String s[] = ip.split("\\.");
            int i1= Integer.parseInt(s[0]);
            int i2= Integer.parseInt(s[1]);
            System.out.println(i2);
            int i3= Integer.parseInt(s[2]);
            int i4= Integer.parseInt(s[3]);
            if(i1>0&&i1<256&&i2<256&&i3<256&&i4<256)
                a = true;

            }
            return a;
         }
            
public String cutblank(String str){
            
            String str1=str.trim();
            /*
            //如果字符串前有空格
            while(str.startsWith(""))
            {
            str=  str.substring(1,str.length()).trim();
            
            }
            //去掉字符串后的空格
            while(str.endsWith(""))
            {
            str= str.substring(0,str.length()-1).trim();
            System.out.println(str);
            }
            */
            System.out.println(str1);
            
            return str1;

           }

            public static void main(String[] args) throws Exception {
                    String s = " 122.005.133.244 ";
                    isIpv4 isip = new isIpv4();
                    boolean check = isip.isipv4(s);
                    System.out.println(check);
                    System.out.println(check? "是一个常规ipv4地址" : "不是一个ip地址");

                }


}

测试了下,结果妥妥的:

测试 ” 122.005.133.244”

wKiom1lsgT7QYW0NAAA-aOnYNFU468.jpg-wh_50

测试:" a2..451.3 4 "


这里把字符串转换成integer的好处就是避免去判断子串中第一个字符不为0的情况,第一个和第二个不能同时为0的情况