如何用java matcher正则表达式检查IP范围

如何用java matcher正则表达式检查IP范围,java,regex,Java,Regex,我当前用于检查介于:178.2.1.1到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])$ 是否有其他更好的表达方式来检查这一点。您需要小心使用“中间”,因为两个IP都可以有最小/最大值。您可以执行以下操作: /** * check if IP address match pattern * * @param pattern *

我当前用于检查介于:
178.2.1.1到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])$


是否有其他更好的表达方式来检查这一点。

您需要小心使用“中间”,因为两个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;
}
/**
*检查IP地址是否与模式匹配
* 
*@param模式
*            *.*.*.* , 192.168.1.0-255 , *
*@param地址
*            - 192.168.1.1
*地址=10.2.88.12模式=*.*.*结果:true
*地址=10.2.88.12模式=*结果:真
*地址=10.2.88.12模式=10.2.88.12-13结果:真
*地址=10.2.88.12模式=10.2.88.13-125结果:假
*@如果地址匹配模式,则返回true
*/
公共静态布尔校验匹配(字符串模式、字符串地址)
{
if(pattern.equals(*..*.*)| pattern.equals(“*”)
返回true;
String[]mask=pattern.split(“\\”);
字符串[]ip\U地址=地址。拆分(“\\”);
对于(int i=0;i最大值)
返回false;
}
其他的
返回false;
}
返回true;
}
(部分)

正则表达式 假设要匹配
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中对
InetAddress
进行解析。如果是IPv4,则可以简单地执行绑定检查,如部分描述的:

String s=“178.2.1.178”;
Inet4Address a=(Inet4Address)InetAddress.getByName;
字节[]b=a.getAddress();
intip=((b[0]&0xFF)可以很容易地提供答案,如本代码示例所示。
免责声明:我是该库的项目经理

public static boolean check(String addressToCheck) {
    return new IPAddressString("178.2.1.1-254").getAddress().
        contains(new IPAddressString(addressToCheck).getAddress());
}

定义“between”。您指定的是一个上限和一个下限。但是正则表达式在这方面是完全错误的工具。您应该只使用IP地址本身作为32位整数或字节数组,并进行算术运算。给定的正则表达式与请求的范围完全不匹配。“between”是什么意思?从数字上讲,第二个ip比第一个ip低。我想知道为什么,当有一个ip时,人们仍然坚持使用正则表达式。在Java中,你可以使用这个例子。@biziclop:这些文章意味着第一个I位是有意义的。这里不包括
255
0
(是的,我知道这些是特殊的),但假设您希望ip介于
178.2.8.14
194.45.2.41
之间,出于某种奇怪的原因,您无法使用这种掩码执行此操作。我想我应该使用
biginger
而不是
int
,因为它有一个合适的构造函数(这将不需要奇怪的位移位运算符)并具有能够用相同的逻辑处理IPv6地址的好处。@IanMcLaird:的确,谢谢你的建议。此外,它允许更容易地转换到IPv6。更好吗?
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
}
public static boolean check(String addressToCheck) {
    return new IPAddressString("178.2.1.1-254").getAddress().
        contains(new IPAddressString(addressToCheck).getAddress());
}