Chinaunix

标题: 我凌乱了,求高手分析下这个正则表达式! [打印本页]

作者: capfsxl    时间: 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

求高手赐教,不胜感激!


作者: capfsxl    时间: 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,谢谢!
作者: yinyuemi    时间: 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. }
复制代码

作者: pitonas    时间: 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


   
作者: mcshell    时间: 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
复制代码

作者: capfsxl    时间: 2013-12-12 17:02
感谢各位大侠的帮助!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2