在Java中验证IPv4地址

在Java中验证IPv4地址,java,ip-address,Java,Ip Address,我想使用Java验证IPv4地址。应该使用编写,因此应该有3个点(“”),点之间没有字符、数字,并且数字应该在有效范围内。应该怎么做?编写一个合适的正则表达式,并根据它进行验证。JVM完全支持正则表达式。您可以使用正则表达式,如下所示: (([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])) 这一个验证值是否在范围内 Android支持正则表达式。看 为了

我想使用Java验证IPv4地址。应该使用编写,因此应该有3个点(“
”),点之间没有字符、数字,并且数字应该在有效范围内。应该怎么做?

编写一个合适的正则表达式,并根据它进行验证。JVM完全支持正则表达式。

您可以使用正则表达式,如下所示:

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))
这一个验证值是否在范围内

Android支持正则表达式。看


为了避免反复编译模式,最好放置
pattern.compile()
调用,以便只执行一次

正则表达式非常简单(但请注意,与使用ApacheCommons实用程序相比,它的效率要低得多,而且更难阅读)


基于post

如果它是IP4,则可以使用正则表达式,如下所示:


^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$
尝试InetAddressValidator实用程序类

此处的文档:

请在此下载:


请查看sun.net.util中的IPAddressUtil OOTB类,这应该会对您有所帮助

还有一个未记录的实用程序类
sun.net.util.IPAddressUtil
,尽管它在快速一次性实用程序中可能很有用,但它是一次性的:

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
在内部,这是用于解析IP地址的实用程序类
InetAddress

请注意,对于像“123”这样的字符串,这将返回true,从技术上讲,它不是点十进制表示法。

使用

请查看哪个使用apache commons库
InetAddressValidator

或者您可以使用此功能-

public static boolean validate(final String ip) {
    String PATTERN = "^((0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)\\.){3}(0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)$";

    return ip.matches(PATTERN);
}

这是针对Android的,测试的是
IPv4
IPv6

注意:常用的
InetAddressUtils
已弃用。使用新的
InetAddress

public static Boolean isIPv4Address(String address) {
    if (address.isEmpty()) {
        return false;
    }
    try {
        Object res = InetAddress.getByName(address);
        return res instanceof Inet4Address || res instanceof Inet6Address;
    } catch (final UnknownHostException exception) {
        return false;
    }
}

如果不关心范围,则以下表达式将有助于从1.1.1.1验证到999.999.999.999

"[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}"

有很多方法可以实现这一点,但正则表达式更有效

请看下面的代码:

public static void main(String[] args) {

    String ipStr1 = "255.245.188.123"; // valid IP address
    String ipStr2 = "255.245.188.273"; // invalid IP address - 273 is greater than 255

    validateIP(ipStr1);
    validateIP(ipStr2);
}

public static void validateIP(String ipStr) {
    String regex = "\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b";
    System.out.println(ipStr + " is valid? " + Pattern.matches(regex, ipStr));
}
我会的。javadoc可以在链接中找到。免责声明:我是项目经理

该库透明地支持IPv4和IPv6,因此验证两者的工作原理与下面相同,它还支持CIDR子网

验证地址是否有效

    String str = "1.2.3.4";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

正则表达式是解决这个问题最有效的方法。 请看下面的代码。除了有效性,它还检查它所属的IP地址类,以及它是否为保留IP地址

Pattern ipPattern;
int[] arr=new int[4];
int i=0;

//Method to check validity
 private String validateIpAddress(String ipAddress) {
      Matcher ipMatcher=ipPattern.matcher(ipAddress);

        //Condition to check input IP format
        if(ipMatcher.matches()) {       

           //Split input IP Address on basis of .
           String[] octate=ipAddress.split("[.]");     
           for(String x:octate) { 

              //Convert String number into integer
              arr[i]=Integer.parseInt(x);             
              i++;
         }

        //Check whether input is Class A IP Address or not
         if(arr[0]<=127) {                          
             if(arr[0]==0||arr[0]==127)
                 return(" is Reserved IP Address of Class A");
             else if(arr[1]==0&&arr[2]==0&&arr[3]==0)
                 return(" is Class A Network address");
             else if(arr[1]==255&&arr[2]==255&&arr[3]==255)
                 return( " is Class A Broadcast address");
             else 
                 return(" is valid IP Address of Class A");
         }

        //Check whether input is Class B IP Address or not
         else if(arr[0]>=128&&arr[0]<=191) {        
             if(arr[2]==0&&arr[3]==0)
                 return(" is Class B Network address");
             else if(arr[2]==255&&arr[3]==255)
                 return(" is Class B Broadcast address");
             else
                 return(" is valid IP Address of Class B");
         }

        //Check whether input is Class C IP Address or not
         else if(arr[0]>=192&&arr[0]<=223) {        
             if(arr[3]==0)
                 return(" is Class C Network address");
             else if(arr[3]==255)
                 return(" is Class C Broadcast address");
             else
                 return( " is valid IP Address of Class C");
        }

        //Check whether input is Class D IP Address or not
        else if(arr[0]>=224&&arr[0]<=239) {          
             return(" is Class D IP Address Reserved for multicasting");
        }

        //Execute if input is Class E IP Address
        else  {                                   
             return(" is Class E IP Address Reserved for Research and Development by DOD");
        }

    }

    //Input not matched with IP Address pattern
    else                                     
        return(" is Invalid IP Address");


}


public static void main(String[] args) {

    Scanner scan= new Scanner(System.in);
    System.out.println("Enter IP Address: ");

    //Input IP Address from user
    String ipAddress=scan.nextLine();  
    scan.close();
    IPAddress obj=new IPAddress();

    //Regex for IP Address
    obj.ipPattern=Pattern.compile("((([0-1]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([0-1]?\\d\\d?|2[0-4]\\d|25[0-5]))");

    //Display output
    System.out.println(ipAddress+ obj.validateIpAddress(ipAddress));

}
模式i模式;
int[]arr=新的int[4];
int i=0;
//检验有效性的方法
私有字符串验证ipAddress(字符串ipAddress){
Matcher ipMatcher=ipPattern.Matcher(ipAddress);
//检查输入IP格式的条件
如果(ipMatcher.matches()){
//基于的拆分输入IP地址。
字符串[]octate=ipAddress.split(“[.]”);
对于(字符串x:octate){
//将字符串数转换为整数
arr[i]=整数.parseInt(x);
i++;
}
//检查输入是否为A类IP地址
如果(arr[0]=128&&arr[0]=192&&arr[0]=224&&arr[0]public void setIpAddress(字符串ipAddress){
if(ipAddress.matches(^(?:(:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)\){3}(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)$)ipv4的正则表达式
this.ipAddress=ipAddress;
其他的
System.out.println(“不正确的IP地址”);

}

使用正则表达式在两行中获取有效的ip地址请检查代码的注释会话正则表达式如何工作以获取数字范围

public class regexTest {


    public static void main(String[] args) {
        String IP = "255.001.001.255";
        System.out.println(IP.matches(new MyRegex().pattern));
    }

    }

    /*
    * /d - stands for any number between 0 to 9
    * /d{1,2} - preceding number that 0 to 9 here , can be of 1 digit to 2 digit . so minimum 0 and maximum 99
    * |  this stands for or operator
    *
    * () this is applied on a group to get the single value of outcome
    * (0|1)\d{2} = first digit is either 0 or 1 and other two digits can be any number between ( 0 to 9)
    * 2[0-4]\d - first digit is 2 , second digit can be between 0 to 4 and last digit can be 0 to 9
    * 25[0-5] - first two digit will be 25 and last digit will be between 0 to 5
    *
    * */
    class MyRegex {

        String zeroTo255 = "(\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5])";
        public String pattern =  zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;;

    }
/**
*检查ip是否有效
*
*@param ip待检查
*@如果ip有效,则返回true,否则返回false
*/
私有静态布尔值有效(字符串ip){
字符串[]位=ip.split(“\\”);
如果(位长度!=4){
返回false;
}
for(字符串位:位){
试一试{
if(整型.valueOf(位)<0 | |整型.valueOf(位)>255){
返回false;
}
}捕获(数字格式){
返回false;/*包含其他字符*/
}
}
返回true;
}

apache httpcomponents的库

//ipv4是真的
资产真实(InetAddressUtils.isIPv4Address(“127.0.0.1”);
//未检测到ipv6
assertFalse(InetAddressUtils.isIPv4Address(“2001:0db8:85a3:0000:0000:8a2e:0370:7334”);
maven lib(2019年9月更新)


org.apache.httpcomponents
httpclient
4.5.10
我的解决方案(支持领先的0):


DVM也支持它吗?我正在使用AndroidOk,我会再次检查它…!!它将匹配“001.xxx.xxx.xxx.xxx”。我不确定,所以发布了一个表达式,明确限制
0xx,0x
。静态私有最终字符串IPV4\u REGEX=“([0-1]?[0-9]{1,2})(2[0-4][0-9]\)(25[0-5]\){3}([0-1]?[0-9]{1,2}[0-5])这一行给了我错误:(@khachik有点晚了,但是:那是一个。事实上,RFC1166在第5页给出了
128.009.000.032
作为一个例子。当有4个零时它有效吗?哦,它在android上不起作用。当应用程序启动时,它给出了强制关闭的错误。那么奇怪格式的IP地址呢,比如127.1(这相当于127.0.0.1)?IPv6呢?您只需编写:return ip!=null&&ip.matches(模式)正则表达式的一个潜在问题是,它似乎与010.020.030.040之类的内容相匹配,但这可能会有问题,因为以0开头的数字通常会被解释为八进制数。没错!这忽略了前面的0大小写。@Akarshit Wal的解决方案效果更好。最好为请注意,并非所有技术上有效的IP地址符号都具有t
    String str = "1.2.3.4";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }
public static boolean isIpv4(String ipAddress) {
    if (ipAddress == null) {
        return false;
    }
    String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
    Pattern pattern = Pattern.compile(ip);
    Matcher matcher = pattern.matcher(ipAddress);
    return matcher.matches();
}
Pattern ipPattern;
int[] arr=new int[4];
int i=0;

//Method to check validity
 private String validateIpAddress(String ipAddress) {
      Matcher ipMatcher=ipPattern.matcher(ipAddress);

        //Condition to check input IP format
        if(ipMatcher.matches()) {       

           //Split input IP Address on basis of .
           String[] octate=ipAddress.split("[.]");     
           for(String x:octate) { 

              //Convert String number into integer
              arr[i]=Integer.parseInt(x);             
              i++;
         }

        //Check whether input is Class A IP Address or not
         if(arr[0]<=127) {                          
             if(arr[0]==0||arr[0]==127)
                 return(" is Reserved IP Address of Class A");
             else if(arr[1]==0&&arr[2]==0&&arr[3]==0)
                 return(" is Class A Network address");
             else if(arr[1]==255&&arr[2]==255&&arr[3]==255)
                 return( " is Class A Broadcast address");
             else 
                 return(" is valid IP Address of Class A");
         }

        //Check whether input is Class B IP Address or not
         else if(arr[0]>=128&&arr[0]<=191) {        
             if(arr[2]==0&&arr[3]==0)
                 return(" is Class B Network address");
             else if(arr[2]==255&&arr[3]==255)
                 return(" is Class B Broadcast address");
             else
                 return(" is valid IP Address of Class B");
         }

        //Check whether input is Class C IP Address or not
         else if(arr[0]>=192&&arr[0]<=223) {        
             if(arr[3]==0)
                 return(" is Class C Network address");
             else if(arr[3]==255)
                 return(" is Class C Broadcast address");
             else
                 return( " is valid IP Address of Class C");
        }

        //Check whether input is Class D IP Address or not
        else if(arr[0]>=224&&arr[0]<=239) {          
             return(" is Class D IP Address Reserved for multicasting");
        }

        //Execute if input is Class E IP Address
        else  {                                   
             return(" is Class E IP Address Reserved for Research and Development by DOD");
        }

    }

    //Input not matched with IP Address pattern
    else                                     
        return(" is Invalid IP Address");


}


public static void main(String[] args) {

    Scanner scan= new Scanner(System.in);
    System.out.println("Enter IP Address: ");

    //Input IP Address from user
    String ipAddress=scan.nextLine();  
    scan.close();
    IPAddress obj=new IPAddress();

    //Regex for IP Address
    obj.ipPattern=Pattern.compile("((([0-1]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([0-1]?\\d\\d?|2[0-4]\\d|25[0-5]))");

    //Display output
    System.out.println(ipAddress+ obj.validateIpAddress(ipAddress));

}
public class regexTest {


    public static void main(String[] args) {
        String IP = "255.001.001.255";
        System.out.println(IP.matches(new MyRegex().pattern));
    }

    }

    /*
    * /d - stands for any number between 0 to 9
    * /d{1,2} - preceding number that 0 to 9 here , can be of 1 digit to 2 digit . so minimum 0 and maximum 99
    * |  this stands for or operator
    *
    * () this is applied on a group to get the single value of outcome
    * (0|1)\d{2} = first digit is either 0 or 1 and other two digits can be any number between ( 0 to 9)
    * 2[0-4]\d - first digit is 2 , second digit can be between 0 to 4 and last digit can be 0 to 9
    * 25[0-5] - first two digit will be 25 and last digit will be between 0 to 5
    *
    * */
    class MyRegex {

        String zeroTo255 = "(\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5])";
        public String pattern =  zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;;

    }
/**
 * Check if ip is valid
 *
 * @param ip to be checked
 * @return <tt>true</tt> if <tt>ip</tt> is valid, otherwise <tt>false</tt>
 */
private static boolean isValid(String ip) {
    String[] bits = ip.split("\\.");
    if (bits.length != 4) {
        return false;
    }
    for (String bit : bits) {
        try {
            if (Integer.valueOf(bit) < 0 || Integer.valueOf(bit) > 255) {
                return false;
            }
        } catch (NumberFormatException e) {
            return false; /* contains other other character */
        }
    }
    return true;
}
   String pattern="^[0-9](\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25?[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?$";
 private static final String IPV4_PATTERN_ALLOW_LEADING_ZERO =
            "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";