java - 如何通过java matcher正则表达式检查IP范围

标签 java regex

我当前用于检查 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.1178.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/

相关文章:

Java Stream - 收集器内的类型推断问题

java - 从 Maven 插件访问项目类

javascript - AngularJs 中数字的正则表达式

javascript - 匹配 Postgres "operator name"规则的正则表达式

c# - 接受数字 0 到 9999 的正则表达式

php - 从捕获的组中提取值

java - 从 S3 下载所有文件并将它们上传到同一文件夹中

java - android 在新线程中运行类

python - 在 Python 中用任意值替换命名的捕获组

java - Javers 比较 String null 和 ""空字符串