1 part (ping A) : 0.0.0.A
2 parts (ping A.B) : A.0.0.B
3 parts (ping A.B.C) : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D
这几种判断字符串是否为IPV4或者IPV6地址的方式,其内在实现原理都大同小异,除了最后一个方案外都是用正则表达式来实现的。
但是基于正则表达式实现的方法并不能很友好地处理非十进制数字位的情况,而ping命令能够接收的字符串远比这个复杂的多,如果你想通过Java来实现判断ping命令后面的地址是否是合法的IP,那应该是难于上青天,除非你去弄懂ping命令的底层源码。
当然在现实业务场景中,我们判断字符串是否为合法IP地址一般都是基于其标准格式来操作的,也不用担心文中的方法不靠谱,除了第3和最后一个方案外,大胆用吧!
判断字符串是否为IP地址通常都是基于正则表达式实现的,无论是引入外部的依赖包亦或是自己写正则实现,基本都是基于正则表达式实现的判断。然而比较例外的是,jdk自身提供了`Inet4Address.getByName`方法也可以帮助我们实现ip地址的判断。本文将详细列举常见的判断字符串是否为IPV4,IPV6地址的方式,并分析其存在的局限性。
该工具可解析输入域名下对应的所有IP地址(包括IPV4地址和IPV6地址),自己写来用的,分享给大家,提供的是jar包,未混淆代码,可以工具查看源码,如果需要可编译的源码可私聊我。
解析域名:www.baidu.com
IP地址:112.80.248.75
IP地址:112.80.248.76
解析域名:www.taobao.com
IP地址:113.207.33.219
IP地址:113.207.33.220
IP地址:113.207.45.52
IP地址:58.144.252.225
IP地址:2408:8764:0:8:3:0:0:3fc
IP地址:2408:8764:0:8:3:0:0:3fb
IP地址:2408:8764:0:7:3:0:0:3f9
IP地址:2408:8764:0:7:3:0:0:3fa
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:03
$valid = \Ritaswc\ZxIPAddress\IPv4Tool::isValidAddress('114.114.114.114');
$valid = true;
$valid = \Ritaswc\ZxIPAddress\IPv6Tool::isValidAddress('240e:e9:8819:0:3::3f9');
$valid = true;
public class IPAddressRegularExpression {
public final static String IPV4 = "^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$";
public final static String IPV6 =
//8组,无缩减 或 7组::
当我们通过request获取客户端IP时,自身服务器通常会为了保护信息或者负载均衡的目的,对自身服务器做反向代理。此时如果我们通过request.getRemoteAddr();可能获取到的是自身代理服务器的IP,而无法达到获取用户请求ip的目的。
解决办法:
以下整理了各个代理服务器自己开发的转发服务请求头,这些请求头都不是标准的http请求头,不一定所有的代理都会带上这些请求头,所以通...
java内置的IPAddressUtil可以完成常用的Ipv4和ipv6的截取,判断方法,可直接使用。
java判断ipv4和ipv6代码
import sun.net.util.IPAddressUtil;
public class ipCheck {
public static void main(String[] args) {
// String ip = "127.0.0.1";
// String ip = "abcd::abcd:abcd:abcd:ab
public static void main(String[] args) {
System.out.println("请输入要验证的IP地址");
Scanner sc = new Scanner(System.in);
String ipStr = sc.next();
boolean isIpLegal = isIpLe...
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这...
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以,2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如,02001:0db8:85a3:0000:0000:8a2e:0370::7334 是无效的 IPv6 地址。
需要Java 6或更高版本
需要Java 8或更高版本
需要Java 8或更高版本,具有MAC地址支持,与IPv6的EUI-48和EUI-64 MAC集成,新地址框架,新的IP字符串格式已解析和生成以及其他附加功能
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.validator.routines.InetAddressValidator.isValidInet6Address
Caused by: java.l..
- `2[0-4]\d` 表示 200-249 之间的数字
- `|` 表示或者
- `[01]?\d\d?` 表示 0-199 之间的数字,可以是 1-3 位数,其中第一位可以是 0 或 1
- `)` 表示一个分组的结束
- `\.` 表示一个点号
- `{3}` 表示前面的分组重复 3 次
- `(25[0-5]|2[0-4]\d|[01]?\d\d?)` 表示最后一组数字,可以是 0-255 之间的数字
- `$` 表示字符串的结尾
这个正则表达式可以匹配如下的 IPv4 地址:
- 192.168.0.1
- 10.0.0.1
- 172.16.0.1
- 255.255.255.255
如果字符串不是 IPv4 地址,则不会匹配。