+ -
当前位置:首页 → 问答吧 → 问个嵌套匹配的正则

问个嵌套匹配的正则

时间:2011-07-05

来源:互联网

  1. $str=<<TEXT

  2. options nofmterr;
  3. data ecg;
  4.         set hu.ecg;
  5.         tpd=scan(egtpd,1, ' ');
  6.         where  substr(cpevent, 1, 9)^='SCREENING';
  7.    for tpd=1 to 10;
  8.       output;
  9.      put tpd=;
  10.             output;
  11.             output
  12. run;



  13. data ecg;
  14. ........
  15. run;
  16. data pk;
  17. ........
  18. output;
  19. ......
  20. output;
  21. .....
  22. output;
  23. run;
  24. TEXT
  25. ;
复制代码
上面的文本中 只把 

 data xx
      出现三条output
  run;
这个代码匹配出来
意思就是 在data ... run结构中如果output出现三次 则匹配

作者: yakczh   发布时间: 2011-07-05

为什么非要用 RE 这个按行写多简单

作者: zhlong8   发布时间: 2011-07-05

回复 zhlong8


    因为正则是写成参数从配置文件中读出来的,匹配新的规则只需要修改配置文件,不需要改代码

作者: yakczh   发布时间: 2011-07-05

本帖最后由 jason680 于 2011-07-05 13:50 编辑

# cat data_run.pl
  1. use strict;
  2. use warnings;
  3. my $sOutput_count;
  4. my $sData;

  5. while(<DATA>){
  6.   chomp;
  7.   if(m/\s*data\s+.+/){
  8.     $sOutput_count = 0;
  9.     $sData = $_;
  10.   }
  11.   $sOutput_count++ if(m/^\s*output;/);

  12.   if(m/^\s*run;\s*$/){
  13.     if($sOutput_count == 3){
  14.       print "match $sData\n";
  15.     }
  16.   }

  17. }


  18. __DATA__
  19. options nofmterr;
  20. data ecg;
  21.         set hu.ecg;
  22.         tpd=scan(egtpd,1, ' ');
  23.         where  substr(cpevent, 1, 9)^='SCREENING';
  24.    for tpd=1 to 10;
  25.       output;
  26.      put tpd=;
  27.             output;
  28.             output
  29. run;



  30. data ecg;
  31. ........
  32. run;
  33. data pk;
  34. ........
  35. output;
  36. ......
  37. output;
  38. .....
  39. output;
  40. run;
复制代码
# perl data_run.pl
match data ecg;
match data pk;

作者: jason680   发布时间: 2011-07-05

热门下载

更多