如何通过java匹配器正则表达式检查IP范围

时间:2015-05-26 05:11:57

标签: java regex

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])$

还有其他更好的表达方式来检查。

3 个答案:

答案 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.,使用转义符号(\.)并使用正则表达式(^)前面的锚点。

使用库检查边界

一般不足以。大多数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());
}