我部分地问这个问题,因为这是我觉得非常有用的东西,但也要理解答案的语法,这样我就可以制作自己的,有创意的,更好的正则表达式!
所以这里有一个问题:我想在我的代码中找到一个函数,我知道函数名称的一部分,以及函数内部的东西。例如,给定这些功能:
Foo::bar1(Baz* baz)
{
...
doWork();
...
}
Foo::bar2()
{
...
beHappy();
...
}
Foo::hasAbar3Meat(Baz* baz1, Baz* baz2)
{
...
beSad();
...
}
我希望使用正则表达式找到其中包含“beHappy”一词的任何“bar”函数。请记住,这些功能可能会相互调用,更一般地说,我们不知道“......”中的内容。甚至可能是这些功能中不止一个在其中有“快乐”。
编辑:如果由于C ++不是常规语言而无法实现,请解释原因,如果可能的话,给出一个解决方案,其中包含必要的限制(例如,“没有嵌套代码块 - 使用花括号{} - 代码“)。
答案 0 :(得分:4)
假装每个函数都有正确的缩进(没有属于该函数的代码块,并且缩进量小于或等于函数定义的缩进):
/\v(^\s*)regexForFunctionName\(.*[^;](\n\1\{)?(\n$|\n\1\s.*){-}\n\1\s.*\zs(whatToFind)/
(围绕whatToFind,只是为了更多的可读性)。对于您的特定示例,正则表达式将如下所示:
/\v(^\s*)[^(]*bar.*\(.*(\n\1\{)?(\n$|\n\1\s.*){-}\n\1\s.*\zsbeHappy/
最好删除?
附近唯一的(\n\1\{)
符号,以降低它捕获不是函数定义的代码的可能性。根据代码样式,可以对以(\n\1\{)?
结尾的部分添加更多限制。请注意,如果您使用perl(可能还有pcre),您可以编写一个可以使用任何有效C ++代码的表达式,但这个表达式肯定不会是常规的。
答案 1 :(得分:1)
您可以使用\_
运算符在vim中搜索(选中:h /\_
):
/Abar.*\_.*Sad/
答案 2 :(得分:0)
如果您需要它是任何C ++代码,那么您不能使用正则表达式。试想一下宏可以对你的代码做些什么。这是存在宏的有效C ++
VOID_MEMBER_FUNCTION(Foo, bar)
beHappy();
END_FUNCTION
缩小问题的最佳假设是利用编码和命名约定。