我当前用于检查以下 ip 范围的正则表达式178.2.1.1 to 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和之间的所有 IP 地址178.2.1.254(用178代替1),您可以使用以下正则表达式:
^178\.2\.1\.([1-9]\d?|1\d{2}|2[0-4]\d|25[0-4])$
Run Code Online (Sandbox Code Playgroud)
删除最后一个1.,对点使用转义符 ( \.) 并使用正则表达式 ( ^)前面的锚点。
但这一般是不够的。例如,大多数 IP 解析器允许将 IP 指定为127.00.00.01等。此外不要忘记,现在人们转向具有完全不同语法的 IPv6。您最好InetAddress按照此处所述对 Java 中的 进行解析。如果它是 IPv4,则您可以简单地执行边界检查,就像此处部分描述的那样:
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
}
Run Code Online (Sandbox Code Playgroud)
或者正如@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
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用178.2.1.0/24因为.0和.255特殊情况来描述您的 IP 范围,这意味着最后一个字节不重要。在这种情况下,我们谈论的是子网,并且 - 正如@biziclop 所说 - 您可以使用这些 Apache utils。