gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:15:27 25 4
gpt4 key购买 nike

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

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

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

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

并使用正则表达式替换与模式匹配的文本:

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 次正则表达式替换来完成所有这些操作?

最佳答案

这个 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);

关于c - 如何在 "main"正则表达式搜索的每个匹配组中进行子正则表达式替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com