有以下文本 要求匹配 註釋外的內容,匹配之後的內容: aaa bbb ddd eee hhh 可以利用/^xxx/../^xxx/結構來匹配 ,但是出現了以下的嵌套結構: aaa bbb #if defined(lxx_mmi_del) ccc #endif ddd eee #if defined( ...
有以下文本
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