package test;
import java.util.regex.Pattern;
public class TestIp {
/**
* 一、需求:123.0.[22-25,28-29,31].0/24,116.123.16.0/22,112.73.0.0/17 只允许此区间IP传参数
*
* 二、需求演变->需要求出每个IP区间的: 网络掩码、子网地址、广播地址、最小地址、最大地址
* 以112.73.0.0/17为例,详细推算如下:
* 主机地址:01101110 01001011 00000000 00000000
* 网络掩码:11111111 11111111 10000000 00000000
* 子网地址:01101110 01001011 00000000 00000000 (112.73.0.0)
* 子网地址 = 主机地址和网络掩码的与运算
* 广播地址:01101110 01001011 01111111 11111111 (112.73.127.255)
* 广播地址 = 子网地址和网络掩码的异或运算
* 去掉一个网络地址(112.73.0.0)和去掉一个广播地址(112.73.127.255)
* 最小地址:112.73.0.1
* 最大地址: 112.73.127.254
*
* 三、涉及知识点:
* 1.IP 基本概念回顾:
* IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节
* IP地址分成了网络号和主机号两部分:
* 网络号的位数直接决定了可以分配的网络数(计算方法2^网络号位数)
* 主机号的位数则决定了网络中最大的主机数(计算方法2^主机号位数-2)
* 根据2 的n次方转化为容易读懂的10进制如上
* 2.'/24' 代表 11111111.11111111.11111111.00000000 这个是子网掩码,也叫网络码,即:255.255.255.0
* 子网掩码中还可获得的信息是,1表示网络位,0表示主机位,
* 将子网掩码中的主机位变成1就得到了广播地址
* 3.根据IP和子网掩码,可以算出IP的有效范围,用AND与运算,与运算核心是:遇 0 得0,1与1得1
* 可获得子网IP地址,子网中可用的IP地址就在子网IP地址与广播地址之间
* 4.IP 里面一般会存在一个广播地址和一个网络地址,这个两个地址一般是不能用的,可以看下详细资料
* 5.如果公司有 ip地址信息查询:(如:112.73.0.0 或112.73.0.0/17)
* 可以算出112.73.0.0/17 所指的有效IP范围(112.73.0.0 - 112.73.127.255),
* 也可以下个 子网掩码计算器(IPSubnetter),如果都没有只有用上面的方法手动算取
* 6.正则
* 涉及的正则语法:
a. (?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。
例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
b. ^ 匹配输入字符串的开始位置,
如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
c.注意点,正则是一个标志位判断一次的,
例如:0-127就要分来三段来写正则校验,0-99,100-199,120-127
* @param
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestIp test = new TestIp();
String[] dre = new String[]{
"123.0..","123.0..23+4","116.123.16."
,"116.123.16.23","116.123.16.24"
,"310.75.0.1","123.0..30.5",
"123.0..1.9","116.123.16.22",
"116.123.16.0","112.73.0.885","111.75.0.555",
"123.0..30.30","112.73.0.18","123.0..22.0",
"123.0..23.255","123.0..24.0","123.0..25.0",
"116.123.16.0","116.123.17.255","112.73.0.0",
"112.73.126.255","112.73.1.255"};
for (int i=0; i<dre.length;i++){
//test.TestIp(i,dre[i]);
}
//校验 0-255
Pattern pp = Pattern.compile("(?:[1-9]?[0-9]|1[0-9]{2}|2(?:[0-4][0-9]|5[0-5]))");
for(int i=0;i<=256;i++){
if (false == pp.matcher(String.valueOf(i)).matches()){
System.out.println(i);
}
}
//校验 0-127
Pattern pp1 = Pattern.compile("([0-9]{1,2}|1(?:[0-1][0-9]|[2][0-7]))");
for(int i=-1;i<=128;i++){
if (false == pp1.matcher(String.valueOf(i)).matches()){
// System.out.println(i);
}
}
//校验16-19
Pattern pp169 = Pattern.compile("([1][6-9])");
for(int i=0;i<=20;i++){
if (false == pp169.matcher(String.valueOf(i)).matches()){
// System.out.println(i);
}
}
}
public void TestIp(int i, String ip) {
Boolean ipFlag = false;
// 123.0.[22-25,28-29,31].0/24 (123.0.22.0 ---- 123.0.31.255)
Pattern p121 = Pattern
.compile("^(123.0.)([2][2-5]|[2][8-9]|[3][1])[.](?:[1-9]?[0-9]|1[0-9]{2}|2(?:[0-4][0-9]|5[0-5]))");
// 116.123.16.0/22 (116.123.16.0 ---- 116.123.19.255)
Pattern p115 = Pattern
.compile("^(116.123.)([1][6-9])[.](?:[1-9]?[0-9]|1[0-9]{2}|2(?:[0-4][0-9]|5[0-5]))");
// 112.73.0.0/17 (112.73.0.0 ---- 112.73.127.255)
Pattern p110 = Pattern
.compile("^(112.73.)([0-9]{1,2}|1(?:[0-1][0-9]|[2][0-7]))[.](?:[1-9]?[0-9]|1[0-9]{2}|2(?:[0-4][0-9]|5[0-5]))");
ipFlag = p121.matcher(ip).matches() || p115.matcher(ip).matches()
|| p110.matcher(ip).matches();
System.out.println(i + "ipFlag:[" + ip + "]" + ipFlag);
}
}
|