perl 正則匹配嵌套結構

有這麼一道題。。web

  
  
  
  
  1. aaa  
  2. bbb  
  3. #if defined(__MMI_DEL__)  
  4.    ccc  
  5. #endif  
  6. ddd  
  7. eee  
  8. #if defined(__MMI_DEL__)  
  9.    fff  
  10.    ggg  
  11. #endif  
  12. hhh 
要求匹配
註釋外的內容,匹配以後的內容:
aaa
bbb
ddd
eee
hhh
能夠利用/^xxx/../^xxx/結構來匹配 ,可是出現瞭如下的嵌套結構,

 

  
  
  
  
  1. aaa  
  2. bbb  
  3. #if defined(__MMI_DEL__)  
  4.    ccc  
  5. #endif  
  6. ddd  
  7. eee  
  8. #if defined(__MMI_DEL__)  
  9.    fff  
  10.    ggg  
  11. #if defined(__EX222__)  
  12.    KKK  
  13. #if defined(__EX222__)  
  14. woshi  
  15. #endif  
  16.   LLLL  
  17. #endif  
  18. #endif  
  19. sdffff  
  20. #if defined(__EX222__)  
  21. sdfsdf  
  22. sdff  
  23. #endif  
  24. sdfdsf 
就無法用用上面的結構了,必需要使用平衡組,或者是遞歸來作,其實上面的代碼也能夠看作是<div></div>
這種類型,簡單點就是(1*(1+2)/3)這種類型的括號嵌套,能夠利用(?R)來遞歸(perlre中有詳解),或者是(??{code})
動態正則表達式結構。
如下我利用(??{code})來示範寫了一段。。
 
  
  
  
  
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4. my (@arr,$re,$line,@tmp);  
  5. while(<DATA>){  
  6. chomp;  
  7.    s/#if\s*defined.*?$/(/g;  #這裏替換成(和)方便匹配  
  8.    s/#endif/)/g;  
  9.    push @arr,$_;  
  10. }  
  11. $line .= "$_\_" for @arr;  
  12. #print $line;  
  13. $re = qr/(?>[^()]+|\((??{$re})\))*/;  
  14. while($line =~ /(\w*)\($re\)(\w+)/g){  
  15.     push @tmp,split/\_/,"$1$2";  
  16. }  
  17. print join("\n",@tmp);  
  18. __DATA__  
  19. aaa  
  20. bbb  
  21. #if defined(__MMI_DEL__)  
  22.    ccc  
  23. #endif  
  24. ddd  
  25. eee  
  26. #if defined(__MMI_DEL__)  
  27.    fff  
  28.    ggg  
  29. #if defined(__EX222__)  
  30.    KKK  
  31. #if defined(__EX222__)  
  32. woshi  
  33. #endif  
  34.   LLLL  
  35. #endif  
  36. #endif  
  37. sdffff  
  38. #if defined(__EX222__)  
  39. sdfsdf  
  40. sdff  
  41. #endif  
  42. sdfdsf 

 output:正則表達式

aaa
bbb

 
ddd
eee

 
sdffff

 
sdfdsf
相關文章
相關標籤/搜索