有这么一道题。。
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/\_/,""; } 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 bbbddd eee
sdffff
sdfdsf 总结
以上是内存溢出为你收集整理的perl 正则匹配嵌套结构全部内容,希望文章能够帮你解决perl 正则匹配嵌套结构所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)