如何用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());
}