免费注册 查看新帖 |

Chinaunix

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

我凌乱了,求高手分析下这个正则表达式! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-12 14:02 |只看该作者 |倒序浏览
以下是一段字符串,目的想分别捕获数据,然后保存到数组,求高手赐教!


#其中any匹配后要转换为0.0.0.0 255.255.255.255;
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @acl;

  4. $_="permit ip any 192.168.1.0 0.0.0.255 sequence 10
  5. permit ip 192.168.14.0 0.0.0.255 any sequence 20
  6. permit tcp 192.168.32.0 0.0.0.255 gt 23 192.168.30.0 0.0.0.255 eq 80 sequence 30
  7. deny udp 192.168.52.0 0.0.0.255 range 23 56 192.168.30.0 0.0.0.255 lt 78 sequence 40";

  8. while (/(permit|deny)\s+(ip|tcp|udp)\s+((\W+\s+\W+)|any)\s+......./sg){
  9.     if ($3 eq "any "){
  10.              $3 = "0.0.0.0 255.255.255.255";
  11.     }else{
  12.              $3 = "";
  13.     }
  14.     push @acl ,$1.$2.$3.$4."\n";
  15. }
  16. print @acl;
复制代码
因为不对称,我现在省略号不知道怎么匹配了,range后的(23 56)为一组范围,我想得到的结果是:
permit ip 0.0.0.0 255.255.255.255 192.168.1.0 0.0.0.255
permit ip 192.168.14.0 0.0.0.255 0.0.0.0 255.255.255.255
permit tcp 192.168.32.0 0.0.0.255 gt 23 192.168.30.0 0.0.0.255 eq 80
deny udp 192.168.52.0 0.0.0.255 range 23 56 192.168.30.0 0.0.0.255 lt 78

求高手赐教,不胜感激!

论坛徽章:
0
2 [报告]
发表于 2013-12-12 14:28 |只看该作者
补充说明:不是直接地取头掐尾匹配,打印出来后字符串中应该没有空格,都是直接相连的,其中最长的语句可能为permit tcp 192.168.62.0 0.0.0.255 range 28 55 192.168.80.0 0.0.0.255 range 70 78 sequence 50,谢谢!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2013-12-12 15:11 |只看该作者
回复 2# capfsxl
  1. while($s=~/(permit|deny)\s+(ip|tcp|udp)\s+([^\n]+)(?=sequence)/g){
  2. push @cal,$1.$2.sub{$t=shift;$t=~s/any/XXX/;return $t}->($3);
  3. }
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2013-12-12 15:22 |只看该作者
本帖最后由 pitonas 于 2013-12-12 08:24 编辑

{:2_172:}
  1. my $any = '0.0.0.0 255.255.255.255';
  2. $_ = "permit ip any 192.168.1.0 0.0.0.255 sequence 10
  3. permit ip 192.168.14.0 0.0.0.255 any sequence 20
  4. permit tcp 192.168.32.0 0.0.0.255 gt 23 192.168.30.0 0.0.0.255 eq 80 sequence 30
  5. deny udp 192.168.52.0 0.0.0.255 range 23 56 192.168.30.0 0.0.0.255 lt 78 sequence 40";
  6. s/\s*seq.*$//mg;
  7. s/any/$any/mg;
  8. print;
复制代码
回复 1# capfsxl


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2013-12-12 15:26 |只看该作者
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @acl;

  4. $_="permit ip any 192.168.1.0 0.0.0.255 sequence 10
  5. permit ip 192.168.14.0 0.0.0.255 any sequence 20
  6. permit tcp 192.168.32.0 0.0.0.255 gt 23 192.168.30.0 0.0.0.255 eq 80 sequence 30
  7. deny udp 192.168.52.0 0.0.0.255 range 23 56 192.168.30.0 0.0.0.255 lt 78 sequence 40";

  8. s/((?:permit|deny).*?)sequence\s+\d+/my $tmp=$1; $tmp =~s!any!0.0.0.0 255.255.255.255!g;$tmp/eg;
  9. @acl = split;
  10. print @acl
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-12-12 17:02 |只看该作者
感谢各位大侠的帮助!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP