关于网络上IP地址校验正则表达式的一点缺陷

来源:互联网 发布:node.js 生成pdf 编辑:程序博客网 时间:2024/06/10 03:25

 网络上常见的代码如下:


static boolean isIpAddress(String s){
        String regex = "(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d)).(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))
.(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d)).(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        return m.matches();
    }


经过测试,发现像“1.1.112”这样不合法的IP也可以通过校验
对0~255的校验“((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(
//d)”,这段代码应该没问题了,问题就出在对“.”的处理上,于是,改成如下:


static boolean isIpAddress(String s){
        String regex = "(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))
[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        return m.matches();
    }


成功!!!