`
zhoushu126
  • 浏览: 79630 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
IP 过滤
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);
	}
}
Global site tag (gtag.js) - Google Analytics