在main()之前选择原型

时间:2018-08-13 05:54:07

标签: regex vim

我需要一个正则表达式来选择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);

2 个答案:

答案 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()                                          
{
    /* ... */