正則匹配嵌套結構


有以下文本

aaa  
bbb  
#if defined(__MMI_DEL__)  
   ccc  
#endif  
ddd  
eee  
#if defined(__MMI_DEL__)  
   fff  
   ggg  
#endif  
hhh 
要求匹配
注釋外的內容,匹配之后的內容:
aaa
bbb
ddd
eee
hhh
可以利用/^xxx/../^xxx/結構來匹配 ,但是出現了以下的嵌套結構:
aaa  
bbb  
#if defined(__MMI_DEL__)  
   ccc  
#endif  
ddd  
eee  
#if defined(__MMI_DEL__)  
   fff  
   ggg  
#if defined(__EX222__)  
   KKK  
#if defined(__EX222__)  
woshi  
#endif  
  LLLL  
#endif  
#endif  
sdffff  
#if defined(__EX222__)  
sdfsdf  
sdff  
#endif  
sdfdsf 
就沒法用用上面的結構了,必須要使用平衡組,或者是遞歸來做,其實上面的代碼也可以看做是<div></div>
這種類型,簡單點就是(1*(1+2)/3)這種類型的括號嵌套,可以利用(?R)來遞歸(perlre中有詳解),或者是(??{code})
動態正則表達式結構。
以下我利用(??{code})來示范寫了一段。。
#!/usr/bin/perl  
use strict;
use warnings;
my ( @arr, $re, $line, @tmp );
while (<DATA>) {
    chomp;
    s/#if\s*defined.*?$/(/g;    #這里替換成(和)方便匹配
    s/#endif/)/g;
    push @arr, $_;
}
$line .= "$_\_" for @arr;

#print $line;
$re = qr/(?>[^()]+|\((??{$re})\))*/;
while ( $line =~ /(\w*)\($re\)(\w+)/g ) {
    push @tmp, split /\_/, "$1$2";
}
print join( "\n", @tmp );
__DATA__  
aaa  
bbb  
#if defined(__MMI_DEL__)  
   ccc  
#endif  
ddd  
eee  
#if defined(__MMI_DEL__)  
   fff  
   ggg  
#if defined(__EX222__)  
   KKK  
#if defined(__EX222__)  
woshi  
#endif  
  LLLL  
#endif  
#endif  
sdffff  
#if defined(__EX222__)  
sdfsdf  
sdff  
#endif  
sdfdsf 

 output:

aaa
bbb

 
ddd
eee

 
sdffff

 
sdfdsf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM