验证Java中的IPv4地址

| 我想使用Java验证IPv4地址。应该使用点十进制表示法来编写它,因此它应该有3个点(\“
.
\”),没有字符,点之间的数字以及数字应在有效范围内。应该怎么做?     
已邀请:
您可以使用此功能-
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);
}
    
使用正则表达式非常简单(但请注意,与使用Apache Commons Utility的worpet答案相比,这样做效率低下,而且难以阅读)
private static final Pattern PATTERN = Pattern.compile(
        \"^(([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.){3}([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])$\");

public static boolean validate(final String ip) {
    return PATTERN.matcher(ip).matches();
}
基于帖子Mkyong     
尝试使用InetAddressValidator实用程序类。 此处的文档: http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/InetAddressValidator.html 在这里下载: http://commons.apache.org/validator/     
使用番石榴的
InetAddresses.isInetAddress(ipStr)
    
您可以使用正则表达式,如下所示:
(([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.util.regex.Pattern。
class ValidateIPV4
{

   static private final String IPV4_REGEX = \"(([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]))\";
   static private Pattern IPV4_PATTERN = Pattern.compile(IPV4_REGEX);

   public static boolean isValidIPV4(final String s)
   {          
      return IPV4_PATTERN.matcher(s).matches();
   }
}
为了避免反复编译模式,最好放置
Pattern.compile()
调用,使其仅执行一次。     
还有一个未记录的实用程序类
sun.net.util.IPAddressUtil
,尽管它在快速的一次性使用的实用程序中可能很有用,但您不应实际使用它:
boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
在内部,这是ѭ9'实用程序类,用于解析IP地址。 请注意,对于像\“ 123 \”这样的字符串,这将返回true,从技术上讲,它们是有效的IPv4地址,只是不使用点十进制表示法。     
这是针对Android的,测试IPv4和IPv6 注意:不赞成使用常用的“ 10”。使用新的
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 ex) {
        return false;
    }
}
    
IPAddress Java库将执行此操作。链接中提供了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
    }
    
如果是IP4,则可以使用如下正则表达式:
^(2[0-5][0-5])|(1\\\\d\\\\d)|([1-9]?\\\\d)\\\\.){3}(2[0-5][0-5])|(1\\\\d\\\\d)|([1-9]?\\\\d)$
。     
编写一个合适的正则表达式,然后对此进行验证。 JVM完全支持正则表达式。     
有很多方法可以实现这一点,但是正则表达式更有效。 看下面的代码:
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));
}
    
正则表达式是解决此问题的最有效方法。 看下面的代码。沿着有效性,它还会检查其所属的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));

}
    
请查看sun.net.util中提供的IPAddressUtil OOTB类,这对您有帮助。     
如果您不关心范围,则以下表达式将有助于验证从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 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();
}
    
使用正则表达式在两行中获取有效的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;;

    }
    
/**
 * 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;
}
    
public void setIpAddress(String 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]?)$\"))   //regular expression for ipv4 
            this.ipAddress = ipAddress;
        else
            System.out.println(\"incorrect IpAddress\");
    }
    

要回复问题请先登录注册