各位安好,请问怎么用正则表达式验证ip段?求普及

何忆 发布于 2015/05/07 17:37
阅读 2K+
收藏 0
例如,在验证ip192.168.1.159/24的时候,前面的ip和后面的/24都同时验证?当然,其他的合格的也必须可以验证才行。多谢各路大神指导。

以下是问题补充:

@何忆:这个问题我已经解决了,用的是“^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$”这个表达式。但是还有另一个问题,怎么拆分这个IP段?java的。就是把这个ip段里面的ip分出来显示。。 (2015/05/08 10:02)
加载中
0
loyal
loyal

String reg = "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\)/(\d{1,2})$";

String str = "192.168.2.2/24";

第一种懒人方法使用捕获组:

String rst = str.replaceAll(reg,"$1");//得出ip,$2得出第二个括号

第二种正常取捕获组的方式:

 Pattern pattern = Pattern.compile(reg);
  Matcher m = pattern.matcher(str);

if(m.find())

String ip = m.group(1);

何忆
何忆
回复 @loyal : 嗯嗯,非常感谢,麻烦您了。
loyal
loyal
回复 @何忆 : 未测,随手搜的而已 http://www.sharejs.com/codes/java/6717
loyal
loyal
回复 @何忆 : 用32减去这个值,然后再减去2(广播地址和网络地址)就得到一共有多少个具体的ip,然后再根据起始的这个ip得出全部的ip,至于减不减2要看你想要的ip段里是否想包含.
何忆
何忆
非常感谢您提供的思路,不过不是这样的,我想获取的是192.168.2.2/24,这个里面所有的和24相关的子网掩码取得的IP值,具体的我不知道怎么说,就是这个意思吧。。
loyal
loyal
回复 @何忆 : 哎呦,老打错字.是子网掩码
下一页
0
孤独的阅读者
孤独的阅读者
网上一大堆。搜一个基本的按要求修改一下就行
何忆
何忆
但是找不到怎么验证后面的那一段,而且怎么把它拆分成一个个的ip?
0
Feng_Yu
Feng_Yu

正则验证ip真不是一个可维护的方案。根据我以前的经验,正则验证合法ip最终会写的非常长,难以维护。

正则验证可以放前端,后端用ipv4本身的算法来验证——按照点分十进制,32位的格式解析ip,解析成二进制流。这样的好处是显然的——不但容易实现,易于维护,还可以很轻松的判断ip地址是否合法

何忆
何忆
好的,谢谢,可以考虑
0
Pathing
Pathing
(?:ip)?((?:(?<![0-9])0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))(?:/([0-9]+))?
Pathing
Pathing
回复 @何忆 : 拆分是指比如192.168.1.91/24拆成192、168、1、91、24这几个分别拿出来么
Pathing
Pathing
一旦匹配到,$1将保存ip,$2将保存24
何忆
何忆
这个问题我已经解决了,很简单。。。但是还有另外一个问题,怎么拆分这个ip段?java的
0
Pathing
Pathing
(?:ip)?(((?<![0-9])0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))(?:/([0-9]+))?
改成这样,然后group(1)保存整个ip段,group(2)保存192,group(3)保存168, group(4)保存1,group(5)保存91,group(6)保存24.  (以ip192.168.1.91/24为例)
何忆
何忆
回复 @Pathing : 嗯,谢谢大神
Pathing
Pathing
回复 @何忆 : 忘记了..
何忆
何忆
ip段/后面的这个最大为24是吗?
0
Pathing
Pathing

^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,2})$

如果是你这个解法的话, 就改成这样,然后也可以用group(1)....

何忆
何忆
好的,谢谢。我试试看
0
loyal
loyal
价格括号就行了,然后就可以用捕获组了.
何忆
何忆
请问能说详细点嘛?
0
loyal
loyal

你写的 ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$ 如果你能确定你写的没有问题的话,

就在两个不同的部分加()然后就可以用捕获组$1取出.

何忆
何忆
哦哦,好的,谢谢
0
杨延庆
杨延庆

http://cobble19.iteye.com/blog/828414

可以考虑使用StringUtils类和Common Validator包,不然自己写起来太累了

何忆
何忆
嗯,谢谢
返回顶部
顶部