Vim - 用于更改bool变量检查的正则表达式

时间:2014-03-25 13:09:01

标签: regex vim ex

我正在开发一个C项目,我想从

更改所有bool-variable检查
if(!a)

if(a == false)

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

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

我很抱歉要求你查看它,但我无法理解它为什么会失败。

此外,是否有更简单的方法来解决这个问题,并且通常使用vim正则表达式?

4 个答案:

答案 0 :(得分: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 `(`

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

答案 1 :(得分:1)

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

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

  • 确保只匹配if(!var) - 构造,您可以将其更改为while以执行下一个任务
  • c要求确认每次出现

答案 2 :(得分:1)

正如@Kent所说,这不是一项小事。然而,对于仅if(!a)的简单情况,可以完成。

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

<强>解释

  • 首先确保if位于\<绑定的单词上。这可以确保它不属于某个函数名称。
  • \zs\ze分别设置匹配的开始和结束。
  • 通过关键字类\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

答案 3 :(得分:1)

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

  

所有bool变量

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