子网掩码正则表达式

业余草
科技数码领域优质创作者
博客专家认证
2015-12-17 10:31:11
加精
子网掩码正则表达式。
限制只能输入一下子网掩码:
128.0.0.0
192.0.0.0
224.0.0.0
240.0.0.0
248.0.0.0
252.0.0.0
254.0.0.0
255.0.0.0
255.128.0.0
255.192.0.0
255.224.0.0
255.240.0.0
255.248.0.0
255.252.0.0
255.254.0.0
255.255.0.0
255.255.128.0
255.255.192.0
255.255.224.0
255.255.240.0
255.255.248.0
255.255.252.0
255.255.254.0
255.255.255.0
255.255.255.128
255.255.255.192
255.255.255.224
255.255.255.240
255.255.255.248
255.255.255.252
255.255.255.254
255.255.255.255
除了这些组合,没有其他的了,其他的都不能输入。
帮我推荐一下,找找大牛,有困难找组织。
我不想if else 的进行判断,如果有正则能做到就好了,实在不行,我只能用if ese if 来做了
...全文
6476 23 打赏 收藏 举报
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
科學信仰 2015-12-21
引用 15 楼 xmt1139057136 的回复:
[quote=引用 12 楼 q107770540 的回复:] 简化一下: /^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$/
[/quote] 下面这个也能通过还是不允许吧? "128.255.255.255"
  • 打赏
  • 举报
回复
Cx_轩 2015-12-21
学习了!
  • 打赏
  • 举报
回复
gersyc 2015-12-20
看,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  • 打赏
  • 举报
回复
cattpon 2015-12-19
还没看明白是怎么一回事
  • 打赏
  • 举报
回复
刀笑剑 2015-12-19
怎么才能序号呢
  • 打赏
  • 举报
回复
业余草 2015-12-19
引用 17 楼 Runnerchin 的回复:
集合 另外,255.255.255.254 255.255.255.255这两个不是合法的子网掩码
哥你确定??
  • 打赏
  • 举报
回复 1
_南天北落 2015-12-18
引用 10 楼 rui888 的回复:
我觉得3楼的可行啊。正则不同的写法效率不一样。 你可以2种方法都测试的看看
正则的写法不同,效率不同的。 但是你要前台验证的话,正则貌似是最优的选择了。 @小_米 前台写好,后台建议放一个静态List工具里面放IP。不用读取文件浪费服务器性能。
  • 打赏
  • 举报
回复
兔子托尼啊 2015-12-18
我觉得3楼的可行啊。正则不同的写法效率不一样。

你可以2种方法都测试的看看
  • 打赏
  • 举报
回复
灬班班 2015-12-18
正则,放集合,或直接丢表里或某文件中,每次判断是否包含在其中
  • 打赏
  • 举报
回复
X-i-n 2015-12-18
集合
另外,255.255.255.254 255.255.255.255这两个不是合法的子网掩码
  • 打赏
  • 举报
回复
crystal_lz 2015-12-18
我宁可用集合判断 代码不是只写给机器看的 根据需求写出正则容易 根据正则反推需求 试试?。。。
  • 打赏
  • 举报
回复
业余草 2015-12-18
引用 12 楼 q107770540 的回复:
简化一下: /^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$/
  • 打赏
  • 举报
回复
a563734484 2015-12-18
学习一下。。。
  • 打赏
  • 举报
回复
rickylin86 2015-12-18

//对于有限数量的匹配,感觉最简单的就是直接全列出来,反而你合并的话不一定会有高效率.
//因为正则的引擎必须去不断的匹配/推翻/重新调整指针再匹配.
public class Test{
	public static void main(String[] args){
		String[] marks = {
			"128.0.0.0",
			"192.0.0.0",
			"224.0.0.0",
			"240.0.0.0",
			"248.0.0.0",
			"252.0.0.0",
			"254.0.0.0",
			"255.0.0.0",
			"255.128.0.0",
			"255.192.0.0",
			"255.224.0.0",
			"255.240.0.0",
			"255.248.0.0",
			"255.252.0.0",
			"255.254.0.0",
			"255.255.0.0",
			"255.255.128.0",
			"255.255.192.0",
			"255.255.224.0",
			"255.255.240.0",
			"255.255.248.0",
			"255.255.252.0",
			"255.255.254.0",
			"255.255.255.0",
			"255.255.255.128",
			"255.255.255.192",
			"255.255.255.224",
			"255.255.255.240",
			"255.255.255.248",
			"255.255.255.252",
			"255.255.255.254",
			"255.255.255.255"
		};
		String regex = getRegex(marks);
		System.out.println(regex);
		String mark = "255.255.255.255";
		testMark(mark,regex);
	}

	private static void testMark(String mark,String regex){
		System.out.println("'" + mark + "' is " + (mark.matches(regex)? "" : " not ") + "valid!");
	}

	private static String getRegex(String[] marks){
		String regex = "^";
		for(String mark : marks){
			regex += "\\Q" + mark + "\\E|";
		}
		regex = regex.replaceAll("[|]$","\\$");
		return regex;
	}
}
  • 打赏
  • 举报
回复
q107770540 2015-12-18
简化一下: /^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$/
  • 打赏
  • 举报
回复
科學信仰 2015-12-17
可以考虑用三个regex,把它包装成一个方法,进行判断 String regex1 = "255\\.255\\.255\\.(0|128|192|224|240|248|252|254|255)"; String regex2= "255\\.255\\.(0|128|192|224|240|248|252|254|255)\\.0"; String regex3 = "255\\.(0|128|192|224|240|248|252|254|255)\\.0\\.0";
  • 打赏
  • 举报
回复
业余草 2015-12-17
引用 6 楼 u011225629 的回复:
掩码:reg=/^(254|252|248|240|224|192|128|0)\.0\.0\.0$|^(255\.(254|252|248|240|224|192|128|0)\.0\.0)$|^(255\.255\.(254|252|248|240|224|192|128|0)\.0)$|^(255\.255\.255\.(254|252|248|240|224|192|128|0))$/ IP:/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/
你这个改一改可以使用,
  • 打赏
  • 举报
回复
业余草 2015-12-17
引用 5 楼 u011225629 的回复:
关于IP地址的合法性验证很简单,方法也很多,比如字符串分解、正则表达式等,但是子网掩码的要求要比IP更严格一点。   一个合法的子网掩码要满足如下条件:   1、是合法的IP地址   2、二进制码要相邻,即形如111...11000...0的形式   3、与IP地址对应,A、B、C、D各类IP地址都有对应的掩码范围   注:由于第3点跟所设置的IP有关,所以暂不考虑。   我的想法是先验证是否为合法IP,然后将掩码转化成32无符号整型,取反为000...00111...1,然后再加1为00...01000...0,此时为2^n,如果满足就为合法掩码。 C语言代码 int IsSubnetMask(char* subnet) { if(IsIPAddress(subnet)) { unsigned int b = 0, i, n[4]; sscanf(subnet, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]); for(i = 0; i < 4; ++i) //将子网掩码存入32位无符号整型 b += n[i] << (i * 8); b = ~b + 1; if((b & (b - 1)) == 0) //判断是否为2^n return 1; } return 0; }
原理正确,逻辑符合!多谢老兄,不过这只能做后台处理,我要的是前后台双重验证,正则最好!
  • 打赏
  • 举报
回复
君莫傲 2015-12-17
掩码:reg=/^(254|252|248|240|224|192|128|0)\.0\.0\.0$|^(255\.(254|252|248|240|224|192|128|0)\.0\.0)$|^(255\.255\.(254|252|248|240|224|192|128|0)\.0)$|^(255\.255\.255\.(254|252|248|240|224|192|128|0))$/ IP:/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/
  • 打赏
  • 举报
回复
君莫傲 2015-12-17
关于IP地址的合法性验证很简单,方法也很多,比如字符串分解、正则表达式等,但是子网掩码的要求要比IP更严格一点。   一个合法的子网掩码要满足如下条件:   1、是合法的IP地址   2、二进制码要相邻,即形如111...11000...0的形式   3、与IP地址对应,A、B、C、D各类IP地址都有对应的掩码范围   注:由于第3点跟所设置的IP有关,所以暂不考虑。   我的想法是先验证是否为合法IP,然后将掩码转化成32无符号整型,取反为000...00111...1,然后再加1为00...01000...0,此时为2^n,如果满足就为合法掩码。 C语言代码 int IsSubnetMask(char* subnet) { if(IsIPAddress(subnet)) { unsigned int b = 0, i, n[4]; sscanf(subnet, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]); for(i = 0; i < 4; ++i) //将子网掩码存入32位无符号整型 b += n[i] << (i * 8); b = ~b + 1; if((b & (b - 1)) == 0) //判断是否为2^n return 1; } return 0; }
  • 打赏
  • 举报
回复
加载更多回复(3)
发帖
Web 开发

8.0w+

社区成员

Java Web 开发
社区管理员
  • Web 开发社区
加入社区
帖子事件
创建了帖子
2015-12-17 10:31
社区公告
暂无公告