My Current Regular Expression用于检查:178.2.1.1 to 178.2.1.254
之间的IP范围如下:
178.2.1.1.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$
还有其他更好的表达方式来检查。
答案 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.
,使用转义符号(\.
)并使用正则表达式(^
)前面的锚点。
但一般不足以。大多数IP解析器允许例如将IP指定为127.00.00.01
等。此外,不要忘记现在人们迁移到具有完全不同语法的IPv6。您最好使用Java here解析Java中的InetAddress
。如果它是IPv4,您可以简单地执行绑定检查,如部分描述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。
答案 1 :(得分:1)
你需要注意&#34;&#34;因为两个IP都可以有最小值/最大值。你可以这样做:
/**
* check if IP address match pattern
*
* @param pattern
* *.*.*.* , 192.168.1.0-255 , *
* @param address
* - 192.168.1.1
* address = 10.2.88.12 pattern = *.*.*.* result: true
* address = 10.2.88.12 pattern = * result: true
* address = 10.2.88.12 pattern = 10.2.88.12-13 result: true
* address = 10.2.88.12 pattern = 10.2.88.13-125 result: false
* @return true if address match pattern
*/
public static boolean checkIPMatching(String pattern, String address)
{
if (pattern.equals("*.*.*.*") || pattern.equals("*"))
return true;
String[] mask = pattern.split("\\.");
String[] ip_address = address.split("\\.");
for (int i = 0; i < mask.length; i++)
{
if (mask[i].equals("*") || mask[i].equals(ip_address[i]))
continue;
else if (mask[i].contains("-"))
{
byte min = Byte.parseByte(mask[i].split("-")[0]);
byte max = Byte.parseByte(mask[i].split("-")[1]);
byte ip = Byte.parseByte(ip_address[i]);
if (ip < min || ip > max)
return false;
}
else
return false;
}
return true;
}
(aion-emu package的一部分)
答案 2 :(得分:0)
The open-source IPAddress Java library可以很容易地提供答案,如此代码示例所示。 免责声明:我是该图书馆的项目经理。
public static boolean check(String addressToCheck) {
return new IPAddressString("178.2.1.1-254").getAddress().
contains(new IPAddressString(addressToCheck).getAddress());
}