Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清空vim、regex中文件中的所有方法?_Regex_Vim_Keyboard Shortcuts - Fatal编程技术网

清空vim、regex中文件中的所有方法?

清空vim、regex中文件中的所有方法?,regex,vim,keyboard-shortcuts,Regex,Vim,Keyboard Shortcuts,例如,我正在使用vim编辑器,我想清空类中的所有方法 class A { public: int getNumber() const { return number; } void setNumber(int num) { number = num; } }; 我希望有一个正则表达式,我可以替换它,这样的结果就是这样 class A { public

例如,我正在使用vim编辑器,我想清空类中的所有方法

class A {

     public:
        int getNumber() const {
             return number;
        }

        void setNumber(int num) {
             number = num;
        }


};
我希望有一个正则表达式,我可以替换它,这样的结果就是这样

class A {

     public:
        int getNumber() const;

        void setNumber(int num};


};

我知道我可以使用%s进行全局子替换,但我正在寻找方法体下的所有内容。

我认为最好使用录制的宏,而不是正则表达式。很抱歉,我没有时间为您创建一个案例。要开始,请参阅:

:help q

由于大括号当然可能嵌套在函数中,因此很遗憾,不可能创建与相应的结束大括号匹配的正则表达式

幸运的是,VIM确实可以使用%(我相信大多数键盘布局上的shift-5?)键移动到相应的位置(这将向前移动到下一个大括号/括号等,并跳到相应的打开/关闭位置),因此基本上,站在打开大括号之前,c%;将用分号替换整个身体


找到一个函数的开始括号是一件完全不同的事情,我会看看我是否能为您想出一些东西,但是为了让您继续,请执行它一次,然后继续执行。(句号)为每个函数再次执行它。

我不知道正则表达式可以在多行上匹配。彼得推荐一个宏可能是对的。第一种方法中的类似内容可能会起到作用:

[ESC]qa$d%i;0[ESC]q
然后在其他方法的第一行,您可以执行以下操作:

[ESC]@a
以下是它的工作原理:

  • [ESC]-逃生钥匙让你进入 正确的模式
  • qa-将下一个命令另存为 名为“a”的宏
  • $-跳到行的末尾
  • d%-删除到匹配的 括号
  • i、 -插入分号
  • [ESC]-逃生钥匙让你进入 正确的模式
  • q-停止录制宏

  • @a-再次调用宏(在 下一个方法的行)

我希望这有帮助

正如roe所说,用正则表达式来处理所有可能的输入是不可能的。您的语言需要一个完整的解析器。但下面的正则表达式解决了问题的一个子集,这可能就足够了,只要您的文本非常规则并且遵守一些约束:

  • 大括号是方法标题所在行的最后一个字符
  • 右大括号的缩进量与左大括号的缩进量相同,它位于自己的行中,并且是行中的最后一个字符
  • 行以
    int
    void
    开头(您可以展开此列表以包括所有相关类型),忽略前导空格
因此,这适用于您的示例输入:

:%s/\v((^\s+)(int|void).{-})\s+\{$\_.{-}^\2\}$/\1;/
  • \v
    :“非常神奇”模式(无需反斜杠转义所有内容)
  • ((^\s+)
    :(开始捕获\1);捕获此行的缩进级别
  • (int | void)
    :行中的第一个单词(根据需要添加到此列表)
  • {-}
    :此行上的非贪婪匹配(结束\1的捕获)
  • \s+{$
    :尽可能多的空格,然后是一个
    {
    ,然后是行尾
  • \.{-}
    :非贪婪匹配所有内容,包括换行符
  • ^\2\}$
    :从一行开始,匹配我们在上面捕获的空格数,然后在该行末尾添加一个结束大括号
如果您知道方法头行缩进了多少空格,那么可以将其插入正则表达式中以代替
(^\s+)
,使其更简单


我保证您可以很容易地想到使这个正则表达式失败的可能输入。

我将使用CTAG来构建在头文件中声明和定义的函数列表。该列表将包含内联定义的行,而不是查找该行的正则表达式

然后按相反的顺序转到函数的定义行,搜索其开始括号,并应用d%。只要函数的注释中没有任何不平衡的括号,它就可以正常工作


顺便说一句,为了不丢失定义,我有一个将内联函数定义移动到相关的.cpp的方法。

我认为是在“int num”之后你应该有一个闭括号,而不是括号。你有两次相同的错误…;)d%i;应该缩写为c%;从大括号前的空格开始,否则你会在每行的末尾得到一个空格(错误不大,但可能有点不雅),或者你可以使用d%a;