1

我正在开发一个 C 项目,我想更改所有布尔变量检查

if(!a)

if(a == false)

为了使代码更易于阅读(我想对 while 语句做同样的事情)。无论如何,我正在使用以下正则表达式,它搜索感叹号后跟小写字符和最后一个右括号。

%s/\(.*\)!\([a-z]\)\(.*\))\([^)]+\)/\1\2\3 == false)\4/g

很抱歉让您查看它,但我不明白为什么它会失败。

另外,有没有更简单的方法来解决这个问题和一般使用 vim 正则表达式?

4

4 回答 4

1

要在 vim 中执行此操作,您可以使用以下命令:

%s/\(if(\)!\([^)]\+\)/\1\2==false/c

  • 确保只有if(!var)-constructs 匹配,您可以将其更改while为下一个任务
  • c每次出现都要求确认
于 2014-03-25T13:20:43.040 回答
1

除了已经给出的答案之外,我想说代码闻起来不像需要重构。对于全局正则表达式替换,主要问题是找到

所有布尔变量

并将它们与指针等区分开来。

于 2014-03-25T14:50:26.317 回答
1

一种解决方案应该是这个:

%s/\(.*\)(\(\s*\)!\(\w\+\))/\1(\3 == false)/gc

在这里,我们执行以下操作:

%s/\(.*\)(\(\s*\)!\(\w\+\))/\1(\3 == false)/gc

   \--+-/|\--+--/|\---+--/|
      |  |   |   |    |   finally test for a single `)`.
      |  |   |   |    (\3): then for one or more word characters (the var name).
      |  |   |   the single `!`
      |  |   (\2): then for any amount of white space before the `!`
      |  the single `(`
      (\1): test for any characters before a single `(`

然后,它被第一个、第三个模式替换,然后附加 text == false,根据需要打开和关闭括号。

于 2014-03-25T13:19:43.963 回答
1

正如@Kent 所说,这不是一件小事。但是对于简单的情况,if(!a)它可以做到。

:%s/\<if(\zs!\(\k\+\)\ze)/\1 == false/c

解释:

  • 首先确保if是在一个由\<. 这确保它不是某些函数名称的一部分。
  • \zs\ze分别设置比赛的开始和结束。
  • 通过关键字 class 捕获变量\k\w也可以)以\(\k\+\)
  • 为了额外的安全,使用c标志来确认每个变电站。

想法:

  • 这将需要针对其他构造进行更新,例如while
  • 可能需要对额外的空白进行更改,例如\<if\s*(\s*\zs!\(\k\+\)\ze\s*)
  • 可能想要使用[a-z0-9_]而不是\k\w避免捕获宏
  • 在某些情况下,您可能没有构造:foo = !a && b;
  • 这仅处理false案件。做事a == true可能要棘手得多

根据您的情况,执行以下操作可能是最安全的:

:%s/!\([a-z0-9]\+\)/\1 == false/gc
于 2014-03-25T14:31:48.070 回答