如何在" main"的每个匹配组中替换子正则表达式。正则表达式搜索?

时间:2015-11-09 15:03:01

标签: c regex perl hook

我正在处理一些关于挂钩现有lib的事情。实施细节与我的问题无关。简而言之,我有必要为lib中的每个原始函数编写一个函数定义,如下所示:

void Hooked_OriginalFunctionName(int arg0, bool arg1, const char* arg2) {
   OriginalFunctionName(arg0,arg1,arg2);
   //Do other things:
}

显然,手动编写这些函数的标题(上面的代码" //做其他事情"注释)是一项繁琐的工作,因此正则表达式替换将是一个更好的选择:我可以复制并粘贴原始函数声明:

void OriginalFunction0(int arg0);
void OriginalFunction1(int arg0, bool arg1);
void OriginalFunction2(const char* arg0, int arg1);
... ...

使用正则表达式替换匹配pattern的文本:

void\s(\w+)\((.+)\); 

使用:

void Hooked_$1($2) {$1($2);//Do other things}

这种方法可以生成如下代码:

void Hook_OriginalFunction2(const char* arg0, int arg1) {
    OriginalFunction2(const char* arg0, int arg1);
    //Do other things
}

但是,函数调用的参数列表格式显然是错误的。那我怎么能随后替换

"const char* arg0, int arg1"

"arg0, arg1"

?是否可以通过仅1个正则表达式替换来完成所有这些?

1 个答案:

答案 0 :(得分:1)

这个perl脚本似乎可以满足您的需求。它使用负面的后置断言来识别要从属性列表中删除的内容:非空格不以逗号或右括号结尾,后跟空格。

#! /usr/bin/perl
use warnings;
use strict;

while (<DATA>) {
    if (my ($func, $args) = /void (\w+)\((.+)\);/) {
        print "void Hooked_$func($args) {\n";
        $args =~ s/\S+(?<![,)]) //g;
        print "    $func($args);\n";
    }
}

__DATA__
void OriginalFunction0(int arg0);
void OriginalFunction1(int arg0, bool arg1);
void OriginalFunction2(const char* arg0, int arg1);
void OriginalFunctionName(int arg0, bool arg1, const char* arg2);