如何匹配功能代码块与正则表达式

时间:2010-02-02 18:07:44

标签: visual-studio regex

我喜欢删除所有具有特定单词的函数,例如,如果单词是'apple':

void eatapple()
{
// blah
// blah
}

我想删除“void”到“}”的所有代码。 我试过的是:

^void.*apple(.|\n)*}

但是我花了很长时间才认为这里出了问题。

我正在使用Visual Studio。谢谢。

5 个答案:

答案 0 :(得分:2)

澄清jeong的最终解决方案,我认为它非常聪明:它有效,但它取决于以非常特殊的方式格式化的代码。但这没关系,因为大多数IDE都可以强制执行特定的格式化标准。如果我可以给出一个相关的例子 - 这个问题让我来到这里 - 我希望找到表单的表达式(用Java编写)

if (DEBUG) { 
  // possibly arbitrary statements or blocks
}

是的,在技术上不是常规的,但我在文件上运行了Eclispe代码格式化程序,以确保它们一定看起来像这样(我们公司通常的首选代码样式):

if (DEBUG) {
  statement();
  while (whatever) {
    blahblahblah(etc);
  }
  // ...
}

然后寻找这个(当然这是Java正则表达式语法)

^(\s*)if \(DEBUG.*(?:\n\1  .*)*\n\1\}

做了这个伎俩。

答案 1 :(得分:1)

终于做到了。

^void.*(a|A)pple\(\)\n\{\n((\t.*\n)|(^$\n))*^\}

答案 2 :(得分:0)

功能块不规则,因此在这种情况下使用正则表达式是个坏主意。

如果你真的有大量需要删除的功能(超过你可以手动删除(表明你的代码库有问题 - 但我离题了))那么你应该写一个快速的大括号计数解析器在这种情况下尝试使用正则表达式。

这应该很容易,特别是如果你可以假设牙箍已经平衡了。读入令牌,找到一个匹配“apple”,然后继续前进,直到你到达与“apple”令牌后面的那个匹配的括号。删除之间的所有内容。

答案 3 :(得分:0)

理论上,常规语言不能表达由上下文无关语法描述的句子。如果是一次性工作,为什么不手动完成。

答案 4 :(得分:0)

切换到VI。然后,您可以选择左括号,然后按d%删除该部分。