0

是否可以在 Visual Studio 中进行查找和替换,以用一组括号替换一组特定函数(所有函数都具有相同的签名)的结束括号?

替换这个:

int foo(int)
{
    something;
}

有了这个:

int foo(int)
{
    something;
}
}

我能够想出的不涉及复制/粘贴的唯一方法是使用正则表达式来识别这一点:

}

int foo2(int)

并替换为:

}
}

int foo2(int)

它利用了大多数匹配函数都是有序的这一事实。它仍然不完美,因为它会错过序列中的最后一个。一种更清洁的方式会很好,但我不确定是否有。我怀疑可能存在的唯一原因是智能感知。我想也许我可以利用 Visual Studio 知道函数何时开始和结束的事实。

相信我,在我的具体情况下,这样做在语法上是有意义的。谢谢你。

4

2 回答 2

0

我不相信只有正则表达式有更清洁的解决方案。不幸的是,虽然正则表达式可以匹配模式,但它们不能表示语法,例如,匹配左括号和右括号。

为了稍微探索一下,假设我写了一些正则表达式来找到一个左括号,接受其他字符,然后是一个右括号。这是行不通的,因为在

void foo()
{
    if (bar)
    {
    }
}

它将匹配 foo 的左括号和 bar 的右括号。我们需要一些方法来计算开括号和右括号,而正则表达式没有给我们任何方法来做到这一点。

这就是为什么编译器通常会将您的代码读取分为两个主要步骤:

  1. 扫描,将代码分解为标记,例如voidfoo(){} 等。这可以通过正则表达式或以类似方式匹配标记的代码来完成。

  2. 解析,其中标记是根据语言的语法组织的,通常会产生抽象语法树

于 2013-07-15T12:19:42.320 回答
-1

我曾经做过类似的工作。你可以把

^{:i:b+:i\(.*\).*\n\{\n(:b+.*\n|:Wh\n)*}\}

在“查找什么输入框”和

\1}\n}

在“替换为输入框”中。

上述查找模式可以找到以下形式的任何代码块:

xxx xxx(xxxxxxxxx)
{
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
}

并将其替换为:

xxx xxx(xxxxxxxxx)
{
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
}
}

如果您仍然不知道如何在 Visual Studio 中使用正则表达式,请参阅 http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.80).aspx

于 2013-07-15T13:03:55.503 回答