代码之家  ›  专栏  ›  技术社区  ›  builder-7000

在main()之前选择原型

  •  0
  • builder-7000  · 技术社区  · 7 年前

    我需要一个正则表达式来选择之前的原型 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 回复  |  直到 7 年前
        1
  •  1
  •   sidyll    7 年前

    这完全取决于所需的灵活性。通过分析约束,您可以开始解决此类问题。是什么使一堆字符被认为是函数声明?一个简单的观察点指向以 ); int main 考虑到你例子的背景。

    匹配以结尾的多行 :

    /\v(.*\);\n)+
    

    如果它们可能在 ; \_s 很方便,因为它匹配空白和换行符。这也允许在原型行之间使用空行:

    /\v(.*\)\s*;\_s{-})+
    

    注意使用 {-} 而不是 * 内景主景

    /\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()                                          
    {
        /* ... */
    
        2
  •  1
  •   B.G.    7 年前

    /^$\n\zs.*\n.*\ze\n\nint main
    

    但可能需要一些改进,它不会检查您要选择的两行上是否确实存在有效文本。但重要的是 :h \zs :h \ze