jon*_*yeo 1 c++ regex visual-studio
我想像这样更改项目中的所有功能。
void Enemy::Create(int asdf, int asdf, float asdf)
{
}
Run Code Online (Sandbox Code Playgroud)
->
void Enemy::Create(int asdf, int asdf, float asdf)
{CCLOG("ERROR OCCURED");
}
Run Code Online (Sandbox Code Playgroud)
下面的代码是另一个例子。
void Enemy::Change()
{
}
Run Code Online (Sandbox Code Playgroud)
->
void Enemy::Change()
{CCLOG("ERROR OCCURED");
}
Run Code Online (Sandbox Code Playgroud)
但是我的项目有太多的功能不能像它一样改变。所以我决定用正则表达式把所有的函数都改成这样。
(Visual Studio 支持用正则表达式替换代码)
但是我不熟悉正则表达式,所以我不知道它。
如何以上方式更改项目中的所有功能?
我将详细介绍提出它的过程,而不是仅仅给你一个神秘的表达。
就像编译器解析代码一样,您可以根据标记序列(创建规则)来编写正则表达式。因为我们只对方法定义的检测特别感兴趣,所以您可以将参数列表视为参数之间的任何内容。
你可以这样想——
void Enemy::Create(int asdf, int asdf, float asdf) {
Run Code Online (Sandbox Code Playgroud)
概括为
<Identifier><Whitespace><Identifier>::<Identifier>(<Anthing>)<Whitespace>{
Run Code Online (Sandbox Code Playgroud)
在 C++ 中,标识符是_或A-Z后跟零个或多个_,A-Z或0-9。照这样说 -
<Identifier> = [a-zA-Z_][a-zA-Z0-9_]*
<Whitespace> = [\n\r\s]+
<Anything> = .*
Run Code Online (Sandbox Code Playgroud)
所以表达式应该是这样的
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($1)
([\n\r\s]+) # <Whitespace> ($2)
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($3)
:: # ::
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($4)
\( # (
(.*) # <Anything> ($5)
\) # )
([\n\r\s]+) # <Whitespace> ($6)
\{ # {
Run Code Online (Sandbox Code Playgroud)
但是 Visual Studio 不支持多行查找,所以使用这个
([a-zA-Z_][a-zA-Z0-9_]*)([\n\r\s]+)([a-zA-Z_][a-zA-Z0-9_]*)::([a-zA-Z_][a-zA-Z0-9_]*)\((.*)\)([\n\r\s]+)\{
Run Code Online (Sandbox Code Playgroud)
对于替换,您必须使用上面列出的捕获组重建表达式。您将在此处插入CCLOG.
$1$2$3::$4($5)\n{CCLOG("ERROR OCCURED");
Run Code Online (Sandbox Code Playgroud)
请注意,这是非常粗略的,只应用于快速而肮脏的事情,例如在 Visual Studio 中重构代码。它不会处理其他情况,如构造函数初始化列表、throw、const、noexcept 等。但您可以使用相同的概念编写表达式来处理它。