使用Perl匹配函数

时间:2014-07-31 06:18:25

标签: regex perl

我有一个具有许多功能的文件,如下所示,其中包含参数。我想打印该函数的起始'{'到结束'}'的行号。所以其他所有功能都是如此。

我尝试了什么:

 #!/usr/bin/perl

 format EMPLOYEE =
 @<<<<<<<<<<<<<<<<<<<<<<<<<<<< @####            @####
 $func $start $end
 =======================================================
.

format EMPLOYEE_TOP =
 =======================================================
 Function                        Start            End
 =======================================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

open(FILE, "<input.txt" );
while(<FILE>){
if(/^static/){
chomp;
$cols = (split(/ /))[2];
$func=$cols;
}
}
close FILE;

open(FILE, "<input.txt" );
$line;
$count = 0;
@key1=qw(static);
@key2=qw(return\sfailed);
while($line = <FILE> )
{
$count++;
foreach $k (@key1) 
{
    if ( $line =~ m/$k/ ) 
    {
          $start=$count;
          last;
    }
} 
foreach $k (@key2) 
{
  $r=0;  
    if ( $line =~ m/$k/ ) 
    {              
          last;
    }
    $end=$r+$count;
}
}
close FILE;
write;

文件中的示例代码:

1.static int function1 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
234. }
235.static int function2 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
339. 
}

输出应为:

1 and 234 for function1.
235 and 339 for funciton2.

1 个答案:

答案 0 :(得分:0)

{ {} {} }嵌套:需要递归

这充其量是棘手的,但我会给你一些尝试。

功能分隔符

首先我们需要知道函数是如何开始的。我们可以采取什么作为分隔符?例如,函数定义之前是static int吗?是否保证static int的每个实例都位于定义之前?

最有可能的是,你会有几个分隔符。我们将从一个开始,然后将它们添加到列表中。

递归正则表达式

假设static int是一个正确的分隔符,而且唯一的分隔符 - 我们知道这可能不是这种情况,但我们可以在以后的正则表达式中添加分隔符 - 我们可以使用递归正则表达式来处理嵌套的大括号:< / p>

static int [^{]*\K({(?:[^{}]++|(?1))*})

Perl One-Liner

也许不是最优化的代码,但这让您有机会尝试这种模式:

perl -0777 -ne 'while(m/static int [^{]*\K({(?:[^{}]++|(?1))*})/g){print "$&\n";}' yourfile

尝试一下,然后让我们看看我们是否能够进行调整。