免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7441 | 回复: 6
打印 上一主题 下一主题

求一个端口及端口范围的正则表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-16 17:26 |只看该作者 |倒序浏览
本帖最后由 6954658 于 2015-04-16 17:46 编辑

验证端口范围的,范围中间用-,每组范围间用,分开,如果只有一组范围则最后不能有逗号
可以一个范围比如1-100
也可以是二个范围比如1-100,2-200
也可以是多个范围比如1-100,2-200,3-300,4-400,5-65535

补充一下,还要可以正常验证端口,可以是一个也可以是多个。
所以就是同时要可以验证端口及端口范围,一个或者多个。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2015-04-16 17:42 |只看该作者
回复 1# 6954658

1. Question
input data
procedure
output data

2. Regular Express is not the best solution for this case   

论坛徽章:
0
3 [报告]
发表于 2015-04-16 17:45 |只看该作者
回复 2# jason680


        我们要在一个自有的portal上验证用户的输入信息。只有regex这一种验证方式。类似javascript的实时验证,如果用户输错了,就显示红色,如果没错就正常显示。

论坛徽章:
0
4 [报告]
发表于 2015-04-16 17:50 |只看该作者
本帖最后由 6954658 于 2015-04-16 17:58 编辑

回复 2# jason680


    ^([1-9]\d{0,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])(-([1-9]\d{0,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5]))?$

这个是我现在使用的regex,但是只能过滤单个端口和单个端口范围,无法过滤多个

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2015-04-17 01:12 |只看该作者
回复 4# 6954658

here you are

$ echo 2-122,139-555,777,888-1023,2-65533 | awk -F, 'function dg(c,n,r){for(n=1;n<=c;n++)r=r"[0-9]";return(r)}function re(x, c,d,t,r,cnt){t=split(x,a,"-");if(t==1)return(x"|");s=a[1];e=a[2];while(s<=e){if(s==e)return(r s"|");if(cnt++>15)return(r);t=10**c;sh=int(s/t/10);sh=sh?sh:"";ss=(int(s/t)%10);sn=(sh+1)*t*10;if(sn<=e){r=r sh "["ss"-9]"dg(c)"|";c++;s=sn;continue}if((e-s)/t<1){c--;continue};d=int((e-s)/t);r=r sh "["ss"-"ss+d-1"]" dg(c)"|";c--;s+=d*t}return(r"|")}{for(n=1;n<=NF;n++){p=p re($n)}for(n=1;n<=9;n++)gsub("\\["n"-"n"\\]",n,p);gsub("[|]$",")$",p);print "^("p}'
^([2-9]|[1-9][0-9]|1[0-1][0-9]|12[0-1]|122|139|1[4-9][0-9]|[2-4][0-9][0-9]|5[0-4][0-9]|55[0-4]|555|777|88[8-9]|89[0-9]|9[0-9][0-9]|10[0-1][0-9]|102[0-2]|1023|[2-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-2]|65533)$

$ echo 2-122,139-555,777,888-1023,2-65533 | awk -F, 'function dg(c,n,r){for(n=1;n<=c;n++)r=r"\\d";return(r)}function re(x, c,d,t,r,cnt){t=split(x,a,"-");if(t==1)return(x"|");s=a[1];e=a[2];while(s<=e){if(s==e)return(r s"|");if(cnt++>15)return(r);t=10**c;sh=int(s/t/10);sh=sh?sh:"";ss=(int(s/t)%10);sn=(sh+1)*t*10;if(sn<=e){r=r sh "["ss"-9]"dg(c)"|";c++;s=sn;continue}if((e-s)/t<1){c--;continue};d=int((e-s)/t);r=r sh "["ss"-"ss+d-1"]" dg(c)"|";c--;s+=d*t}return(r"|")}{for(n=1;n<=NF;n++){p=p re($n)}for(n=1;n<=9;n++)gsub("\\["n"-"n"\\]",n,p);gsub("[|]$",")$",p);print "^("p}'
^([2-9]|[1-9]\d|1[0-1]\d|12[0-1]|122|139|1[4-9]\d|[2-4]\d\d|5[0-4]\d|55[0-4]|555|777|88[8-9]|89\d|9\d\d|10[0-1]\d|102[0-2]|1023|[2-9]|[1-9]\d|[1-9]\d\d|[1-9]\d\d\d|[1-5]\d\d\d\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-2]|65533)$


   

论坛徽章:
0
6 [报告]
发表于 2015-04-17 08:55 |只看该作者
本帖最后由 6954658 于 2015-04-17 08:57 编辑

回复 5# jason680


    有点复杂,我研究下,多谢

求职 : Linux运维
论坛徽章:
3
戌狗
日期:2015-01-11 13:27:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯纪念徽章
日期:2015-05-08 15:03:30
7 [报告]
发表于 2015-04-17 09:38 |只看该作者
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $ports="1,3-5,6,9-10,23-29";
  4. print "=input="."\n"."$ports"."\n";
  5. my @port_all=split ',',$ports;
  6. print "=output="."\n";
  7. foreach (@port_all){
  8.    my @port_list=split '-';
  9.    if(@port_list eq 2){
  10.       foreach my $port ($port_list[0]..$port_list[1]){
  11.          print "$port"."\n";
  12.       }
  13.    }
  14.    else {
  15.      print "$port_list[0]"."\n";
  16.    }
  17. }

  18. =input=
  19. 1,3-5,6,9-10,23-29
  20. =output=
  21. 1
  22. 3
  23. 4
  24. 5
  25. 6
  26. 9
  27. 10
  28. 23
  29. 24
  30. 25
  31. 26
  32. 27
  33. 28
  34. 29
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP