子网掩码正则表达式

业余草
科技数码领域优质创作者
博客专家认证
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 来做了
...全文
6691 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 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
  • 打赏
  • 举报
回复 1
引用 17 楼 Runnerchin 的回复:
集合 另外,255.255.255.254 255.255.255.255这两个不是合法的子网掩码
哥你确定??
_南天北落 2015-12-18
  • 打赏
  • 举报
回复
引用 10 楼 rui888 的回复:
我觉得3楼的可行啊。正则不同的写法效率不一样。 你可以2种方法都测试的看看
正则的写法不同,效率不同的。 但是你要前台验证的话,正则貌似是最优的选择了。 @小_米 前台写好,后台建议放一个静态List工具里面放IP。不用读取文件浪费服务器性能。
tony4geek 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}$/
dracularking 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)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧