Vim匹配除一行开头的字符以外的所有内容

时间:2013-11-06 15:17:10

标签: regex vim

我已经广泛搜索了这个答案,我无法在任何地方找到它。我想用一行(使用搜索和替换)或其他命令替换功能块中的所有代码。我还希望能够在整个文件中为多个功能执行此操作。

我有一个像这样的代码块......

  

{
     一些代码
     更多代码...
     许多行随机码
  }

我想用一行代码替换花括号内的所有内容,例如:

  

{
     return STATUS_OK;
  }

我尝试了类似的东西,

  

%s / ^ {_ [^}] + / \ treturn STATUS_OK; / g

但是这会停在第一行}而不是第一行}。在行的开头。

我试过这个

  

%s / ^ {_ [^^}] + / \ treturn STATUS_OK; / g

为了在第一行停在第一行}但是由于某种原因这不起作用。有任何想法吗?感谢。

5 个答案:

答案 0 :(得分:5)

此正则表达式匹配最外层的curlies而不考虑函数名称:

 %s/^{\(\(\s\+}\)\|[^}]\|\_s\)*/{\treturn STATUS_OK;/g

故障:

^{  # match a curly at the beginning of a line
\(  # group these alternations.... either match
     \(\s\+}\) \|  # whilespace followed by a closing curly 
                   # (to get rid of internal blocks) or ..
     [^}]      \|  # match a non curly, or ..
     \_s           # match newlines and whitespaces
 \)*               # match the alternation as long as you can

答案 1 :(得分:2)

这是()对你好吗

qq/{<cr>ci{return STATUS_OK;<esc>q

然后99@q

命令行) 如果您喜欢:s,请尝试:

%s/^{\zs\_.\{-}\ze}/\rreturn STATUS_OK;\r/

你的正则表达式不起作用,因为在这里你需要“全点”(\_.

修改

  

你发布的正则表达式仍然只匹配第一个}而不是匹配   第一个}在一行的开头。

我误解了你的要求。但修改命令以适应这一点相对容易:

%s/^{\zs\_.\{-}\ze\_^}/\rreturn foo;\r

此命令将更改:

asdfasf
{
some code
more code...
many lines of random code
     } (this is not the leading one)

{
some code
more code...
many lines of random code
}

asdfasf
{
return foo;
}

我希望这就是你要找的东西。

答案 2 :(得分:2)

Vim有一个很好的文本对象调用“内部块”,由iBi{调用。此文本对象代表{及其匹配的}。所以一个块或在这种情况下是一个功能块。

iB文本对象与:global:normal命令相结合,可以简化文本更改。

:g/{$/norm ciBreturn STATUS_OK;

解释

  • :g/{patter}/{cmd}全局命令:g将在永久行匹配模式{cmd}
  • 上运行命令{pat}
  • :normal:norm,简称执行正常命令。

如需更多帮助,请参阅:

:h :g
:h :norm
:h iB

答案 3 :(得分:0)

我会用宏来做:

  1. 在寄存器中注明“a”文本“return STATUS_OK”
  2. 找到所有{
  3. 开始录制宏
  4. 转到下一个{
  5. VI {
  6. 粘贴注册表的内容
  7. 重复宏

答案 4 :(得分:0)

这是一个内置的。

/^{/
Vi{C

查找{在您知道的行的开头,V是“视觉上选择行”,i{是“内部大括号”,C您知道。