如何在正则表达式中表示 C++ 函数名?

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 支持用正则表达式替换代码)

但是我不熟悉正则表达式,所以我不知道它。

如何以上方式更改项目中的所有功能?

Aus*_*rst 5

我将详细介绍提出它的过程,而不是仅仅给你一个神秘的表达。

就像编译器解析代码一样,您可以根据标记序列(创建规则)来编写正则表达式。因为我们只对方法定义的检测特别感兴趣,所以您可以将参数列表视为参数之间的任何内容。

你可以这样想——

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-Z0-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 等。但您可以使用相同的概念编写表达式来处理它。