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
试试InetAddressValidator实用程序类。
这里的文档:
在这里下载:
使用番石榴的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(); }