我当前用于检查 ip 范围的正则表达式:178.2.1.1 到 178.2.1.254
如下:
178.2.1.1.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9 ]|25[0-4])$
有没有其他更好的表达方式来检查。
最佳答案
正则表达式
假设您要匹配 178.2.1.1
和 178.2.1.254
之间的所有 IP 地址(使用 178
而不是 1
), 你可以使用下面的正则表达式:
^178\.2\.1\.([1-9]\d?|1\d{2}|2[0-4]\d|25[0-4])$
删除最后一个 1.
,对点使用转义符 (\.
) 并使用正则表达式 (^
) 前面的 anchor >).
使用库进行边界检查
但一般这还不够。例如,大多数 IP 解析器允许将 IP 指定为 127.00.00.01
等。此外,不要忘记现在人们转向语法完全不同的 IPv6。您最好按照 here 中的说明在 Java 中解析为 InetAddress
.如果是 IPv4,您可以简单地执行绑定(bind)检查,就像部分描述的那样 here :
String s = "178.2.1.178";
Inet4Address a = (Inet4Address) InetAddress.getByName(s);
byte[] b = a.getAddress();
int ip = ((b[0] & 0xFF) << 24) |
((b[1] & 0xFF) << 16) |
((b[2] & 0xFF) << 8) |
((b[3] & 0xFF) << 0);
int low = 0xb2020101; //equivalent of 178.2.1.1
int high = 0xb20201fe; //equivalent of 178.2.1.254
if(low <= ip && ip <= high) {
//matches bounds
} else {
//doesn't match bounds
}
或者如@IanMcLaird 所建议的那样,最好使用 BigInteger:
BigInteger addr = new BigInteger(InetAddress.getByName("178.2.1.178").getAddress());
BigInteger low = new BigInteger(InetAddress.getByName("178.2.1.1").getAddress());
BigInteger high = new BigInteger(InetAddress.getByName("178.2.1.254").getAddress());
if(low.compareTo(addr) <= 0 && addr.compareTo(high) <= 0) {
//in range
} else {
//not in range
}
子网
请注意,您可以使用 178.2.1.0/24
描述您的 IP 范围,因为 .0
和 .255
是特殊情况,这意味着最后一个字节不重要。在这种情况下,我们谈论的是一个子网,并且 - 正如@biziclop 所说 - 你可以使用 these Apache utils .
关于java - 如何通过java matcher正则表达式检查IP范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449948/