如何在 "main" 正则表达式搜索的每个匹配组中进行子正则表达式替换?
How to do a sub regular-expression replacing in each matched groups of "main" regular-expression search?
我正在研究有关挂钩现有库的问题。实施细节与我的问题无关。简而言之,我有必要为库中的每个原始函数编写一个函数定义,如下所示:
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_() {();//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 脚本似乎可以满足您的需要。它使用否定后视断言来识别要从属性列表中删除的内容:非白色space 不以逗号或右括号结尾,后跟 space.
#! /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);
我正在研究有关挂钩现有库的问题。实施细节与我的问题无关。简而言之,我有必要为库中的每个原始函数编写一个函数定义,如下所示:
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_() {();//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 脚本似乎可以满足您的需要。它使用否定后视断言来识别要从属性列表中删除的内容:非白色space 不以逗号或右括号结尾,后跟 space.
#! /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);