validationJava中的IPv4地址

我想validation一个IPv4地址使用Java。 它应该使用小数点符号来表示 ,所以它应该有3个点(“ . ”),没有字符,点之间的数字,数字应该在一个有效的范围内。 应该怎么办?

正则expression式很简单(但要注意,这比使用Apache Commons实用程序的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(); } 

基于Mokong的post

使用番石榴的InetAddresses.forString()

 try { InetAddresses.forString(ipStr); } catch (IllegalArgumentException e) { ... } 

你可以使用正则expression式,像这样:

 (([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])) 

这个validation值在范围之内。

Android支持正则expression式。 请参见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实用程序类sun.net.util.IPAddressUtil ,虽然它可能在一个快速的一次性抛弃实用程序中有用,但它实际上不应该使用它:

 boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString); 

在内部,这是InetAddress用于parsingIP地址的实用工具类。

请注意,对于像“123”这样的string,这在技术上是有效的IPv4地址 ,而不是十进制点表示。

你可以使用这个function –

 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的,testingIPv4和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 ex) { return false; } } 

如果是IP4,则可以使用如下正则expression式:

^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\.){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$

IPAddress Java库将做到这一点。 javadoc可在链接中find。 免责声明:我是项目经理。

该库透明地支持IPv4和IPv6,因此validation或者在下面使用相同,并且也支持CIDR子网。

validation地址是否有效

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

写出一个合适的正则expression式并根据它进行validation。 JVM完全支持正则expression式。

如果你不关心范围,下面的expression式将有助于validation从1.1.1.1到999.999.999.999

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

有这么多的方法来实现,但正则expression式更有效率。

看下面的代码:

 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)); } 

请查看sun.net.util中的 IPAddressUtil OOTB类,它应该可以帮到你。

 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(); }