我正在开发一个 C 项目,我想更改所有布尔变量检查
if(!a)
至
if(a == false)
为了使代码更易于阅读(我想对 while 语句做同样的事情)。无论如何,我正在使用以下正则表达式,它搜索感叹号后跟小写字符和最后一个右括号。
%s/\(.*\)!\([a-z]\)\(.*\))\([^)]+\)/\1\2\3 == false)\4/g
很抱歉让您查看它,但我不明白为什么它会失败。
另外,有没有更简单的方法来解决这个问题和一般使用 vim 正则表达式?
要在 vim 中执行此操作,您可以使用以下命令:
%s/\(if(\)!\([^)]\+\)/\1\2==false/c
if(!var)-constructs 匹配,您可以将其更改while为下一个任务c每次出现都要求确认一种解决方案应该是这个:
%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,根据需要打开和关闭括号。
正如@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