我需要一个正则表达式来选择main()
之前的原型。因此,对于以下代码:
#include <stdio.h>
char ga[] = "abcdefghijklm";
void my_array_func(char ca[10]);
void my_pointer_func(char *pa);
int main()
{
/* code */
return 0;
}
在原型的上方和下方都有一个空行。所选文字应为
void my_array_func(char ca[10]);
void my_pointer_func(char *pa);
我目前在Vim中的尝试是:
^\w\_.\{-}\(^\nint main\)\@=
但这匹配
char ga[] = "abcdefghijklm";
void my_array_func(char ca[10]);
void my_pointer_func(char *pa);
答案 0 :(得分:1)
这应该有效
/^$\n\zs.*\n.*\ze\n\nint main
但是可能需要细化,它不会检查要选择的两行上是否确实存在有效文本。但是这里重要的是:h \zs
和:h \ze
答案 1 :(得分:1)
这完全取决于所需的灵活性。您可以通过分析约束来解决此类问题。是什么使一堆字符被视为函数声明?一个简单的观察指向考虑到示例上下文的,在);
之前以int main
结尾的行。
要匹配以);
结尾的多行:
/\v(.*\);\n)+
如果它们在;
之前或之后包含其他空格(不好!),则\_s
会很方便,因为它匹配空格和换行符。这也允许原型行之间有空行:
/\v(.*\)\s*;\_s{-})+
请注意使用{-}
而不是*
来避免占用多余的空格(不完整,最短匹配要满足)。要强制执行这些行,请在int main
之前,可能要加上更多的空格(例如空行),但要在此类空格之前停止:
/\v(.*\)\s*;\_s{-})+\ze\_s*int\_s+main
总结起来,一个简单的/\v(.*\);\n)+
将与您发布的代码中的原型相匹配。上面显示的更复杂的版本即使格式如下也可以匹配它们:
void my_array_func(char ca[10]);
void my_pointer_func(char *pa) ;
int
main()
{
/* ... */