我正在开发一个C项目,我想从
更改所有bool-variable检查if(!a)
到
if(a == false)
为了使代码更容易阅读(我想对while语句做同样的事情)。 无论如何,我使用以下正则表达式,它搜索一个感叹号,后跟一个小写字符和该行的最后一个右括号。
%s/\(.*\)!\([a-z]\)\(.*\))\([^)]+\)/\1\2\3 == false)\4/g
我很抱歉要求你查看它,但我无法理解它为什么会失败。
此外,是否有更简单的方法来解决这个问题,并且通常使用vim正则表达式?
答案 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)