2010-02-02 30 views
0

我喜欢做的是去除例如具有特定词的所有功能,如果字是“苹果”:如何匹配功能代码块的正则表达式

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

我想删除所有代码从'void'到'}'。 我试过是:

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

但它花了很长的时间,我觉得有什么错在这里。

我正在使用Visual Studio。谢谢。

回答

0

终于做到了。

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

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

如果你真的有很多功能需要删除(不止你可以手动删除(提示你的代码库有问题,但我离题了)),那么你应该写一个快速括号计数解析器而不是试图在这种情况下使用正则表达式。

它应该很容易,特别是如果你可以假设大括号已经平衡。阅读令牌,找到与“apple”相匹配的一个,然后继续前进,直到到达与紧跟在“apple”令牌之后的那个支架相匹配的支架。删除之间的一切。

+0

@Welbog,我不认为计算花括号是一个简单的程序来编写。如果必须没有错误,程序必须能够像编译器一样理解源代码。 – Codism 2010-02-02 18:22:49

+0

@Codism:计数大括号很简单。你只需要留心评论和字符串文字中的花括号。你说得对,为了没有错误,你需要为它编写一个上下文无关的解析器,但这是这个任务的复杂程度。只要没有陷阱,支架柜台应该没问题。 – Welbog 2010-02-02 18:29:33

0

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

0

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

+0

我爱六。但我不知道那一个。谢谢 – 2010-02-02 18:54:48

+0

百分号移动到匹配大括号,括号和括号。 – 2010-02-02 19:25:53

2

澄清郑某的最终解决,我认为这是非常聪明的:它的工作原理,但它取决于代码一个非常特殊的方式被格式化。但没关系,因为大多数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\} 

做了诡计。