免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: routesf
打印 上一主题 下一主题

嵌套括号的递归匹配中,look-around assertions不生效 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-08-23 16:54 |只看该作者
需求是这样的:
1. 有如下文本文件,内容有2种情况,一种是xxx {...多层嵌套{},层数未知},另一种是没有{}的类似 version 10.4;
fxp0 {  
        unit 0 {
            family inet {
                address 10.208.85.48/21 {
                    master-only;
                }      
            }      
        }      
    }
apply-groups [ re0 re1 global "${node}" ];
version 10.4;
lo0 {   
        unit 0 {
            family inet {
                address 74.11.0.1/32;
            }      
        }      
    }
2. 我想用一个正则来匹配所有 xxx {...}, 通过@array = $cfg =~ /$ptn/g把它存到一个数组里,如下正则大部分情况下是没问题的,但处理不了下面这种情况,也就是引号里边出现未匹配的{},但是引号里出现未匹配的{}是允许的
server-to-client {
                    dfa-pattern "(ST\x00 01\xC|\x00\xX\x08 00\x\}\x08 0d 0a\x).*";
                }

my $ptn = qr/(
([\S]+)\s
    (
        \{
            (
                (?:
                    (?>[^{}]+)
                    |
                    (?3)
                )*
            )
        \}
    )
)/x;



回复 9# 104359176


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
12 [报告]
发表于 2013-08-23 17:13 |只看该作者
回复 8# routesf
  1. 我觉得是的,下面是我写的,思路基本是一样的,供你参考吧

  2. #!/usr/bin/perl5.12 -w

  3. use strict;

  4. my $tag;
  5. my $text;
  6. while(<DATA>){
  7.     if(/(?<!\\)[{]/){
  8.         $tag = 1;
  9.             $text = $_;       
  10.             while(<DATA>){
  11.             $tag += /(?<!\\)[{]/ ? 1 :
  12.                 /(?<!\\)[}]/ ? -1 : 0;
  13.                 $text .= $_;
  14.             last if ! $tag;
  15.         }
  16.             print $text;
  17.     }
  18. }


  19. __DATA__
  20. xxx
  21. application junos:PCANYWHERE {
  22.         type PCANYWHERE;
  23.         index 121;
  24.         port-mapping {
  25.                 port-range {
  26.                         tcp 5631;
  27.                         udp 5632;
  28.                 }
  29.         }
  30.         signature {
  31.                 port-range {
  32.                         tcp 0-65535;
  33.                         udp 0-65535;
  34.                 }
  35.                 client-to-server {
  36.                         dfa-pattern "(ST|\x00 00 00 00\x).*";
  37.                 }
  38.                 server-to-client {
  39.                         dfa-pattern "(ST\x00 01\xC|\x00\{\xX\x08 00\x\}\x08 0d 0a\x).*";
  40.                 }
  41.                 min-data 8;
  42.                 order 85;
  43.         }
  44. }
  45. XXX

  46. xxx
  47. application junos:PCANYWHERE {
  48.         type PCANYWHERE;
  49.         index 121;
  50.         port-mapping {
  51.                 port-range {
  52.                         tcp 5631;
  53.                         udp 5632;
  54.                 }
  55.         }
  56.         signature {
  57.                 port-range {
  58.                         tcp 0-65535;
  59.                         udp 0-65535;
  60.                 }
  61.                 client-to-server {
  62.                         dfa-pattern "(ST|\x00 00 00 00\x).*";
  63.                 }
  64.                 server-to-client {
  65.                         dfa-pattern "(ST\x00 01\xC|\x00\{\xX\x08 00\x\}\x08 0d 0a\x).*";
  66.                 }
  67.                 min-data 8;
  68.                 order 85;
  69.         }
  70. }
  71. XXX
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
13 [报告]
发表于 2013-08-23 18:16 |只看该作者
你需要用一个算法把所有的字符串,也就是 "" 之间的东西替换掉,把替换结果保存到一个别的数据结构中。
剩下的事情就简单了多了。

code "string1" code "string2"

=> code <s1> code <s2>

{
    s1 => 'string1',
    s2 => 'string2',
}

提取完了,然后在替换回来。

论坛徽章:
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
14 [报告]
发表于 2013-08-23 18:17 |只看该作者
yinyuemi 发表于 2013-08-23 05:06
回复 4# routesf
  1. 用打点法比较保险和高效
复制代码

thanks~ what is 打点法? please give me an example about taht ..

论坛徽章:
0
15 [报告]
发表于 2013-08-23 18:23 |只看该作者
不错的思路,找空尝试一下
回复 13# 104359176


   

论坛徽章:
0
16 [报告]
发表于 2013-08-23 18:27 |只看该作者
我理解yinyuemi的打点法是用一个statck,遇到左括号就push,右括号就pop,类似这样的

回复 14# pitonas


   

论坛徽章:
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
17 [报告]
发表于 2013-08-23 18:38 |只看该作者
回复 16# routesf


    thanks !
please give me an example about taht...please~~

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
18 [报告]
发表于 2013-08-23 19:27 |只看该作者
回复 14# pitonas
  1. #!/usr/bin/env perl

  2. use strict;
  3. my $dots;
  4. my $ext;
  5. while(<DATA>){

  6.         if(/{/){
  7.                 $dots =~ s/^/./;
  8.                 p($_);
  9.                 $ext .= $_;
  10.                 while(<DATA>){
  11.                         /{/ ? do {$dots =~ s/^/./} :
  12.                         /}/ ? do {$dots =~ s/\.//} : do {$dots .= ""};
  13.                         p($_);
  14.                         $ext .= $_;
  15.                         last if $dots !~ /\./;
  16.                 }
  17.         }else{
  18.             p($_)
  19.         }
  20. }

  21. print "\nExtract: \n",$ext,"\n";

  22. sub p(){
  23.         print "Dot: $dots\t\t",shift;
  24. }
  25. __DATA__
  26. ###
  27. xxx{
  28.     yyy{
  29.             zzz{
  30.                 ###
  31.                 }
  32.         }
  33. }
  34. ###

复制代码

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
19 [报告]
发表于 2013-08-24 11:09 |只看该作者
本帖最后由 yakczh_cu 于 2013-08-24 11:09 编辑
  1.     /{/ ? do {$dots =~ s/^/./} : /}/ ? do {$dots =~ s/\.//} : do {$dots .= ""};
复制代码
这是三目运算吗? 

论坛徽章:
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
20 [报告]
发表于 2013-08-24 17:17 |只看该作者
回复 18# yinyuemi
thank you very much!!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP